Функции фабрики python по сравнению с классом

Просто работая через обучение python и начал смотреть на вложенные / заводские функции (простой пример):

def maker(N): def action(X): return X * N return action 

Существуют ли какие-либо преимущества фабричных функций над созданием класса? представление? Память? очистить?

3 Solutions collect form web for “Функции фабрики python по сравнению с классом”

То, что мне больше всего нравится в вложенных функциях, состоит в том, что оно менее многословно, чем классы. Эквивалентное определение класса для вашей функции-производителя:

 class clsmaker(object): def __init__(self, N): self.N = N def __call__(self, X): return X * self.N 

Это не кажется настолько плохим, пока вы не начнете добавлять дополнительные аргументы к конструктору. Затем, делая это, путь класса принимает дополнительную строку для каждого аргумента, а функция просто получает дополнительные аргументы.

Оказывается, есть преимущество скорости для вложенных функций:

 >>> T1 = timeit.Timer('maker(3)(4)', 'from __main__ import maker') >>> T1.timeit() 1.2818338871002197 >>> T2 = timeit.Timer('clsmaker(3)(4)', 'from __main__ import clsmaker') >>> T2.timeit() 2.2137160301208496 

Это может быть связано с тем, что в версии вложенных функций меньше кодов операций:

 >>> dis(clsmaker.__call__) 5 0 LOAD_FAST 1 (X) 3 LOAD_FAST 0 (self) 6 LOAD_ATTR 0 (N) 9 BINARY_MULTIPLY 10 RETURN_VALUE >>> act = maker(3) >>> dis(act) 3 0 LOAD_FAST 0 (X) 3 LOAD_DEREF 0 (N) 6 BINARY_MULTIPLY 7 RETURN_VALUE 

Сравнение фабрики функций с классом сравнивает яблоки и апельсины. Используйте класс, если у вас есть сплоченный сбор данных и функций, вместе называемый объектом. Используйте фабрику функций, если вам нужна функция, и хотите параметризовать ее создание.

Ваш выбор двух методов должен зависеть от значения кода.

Функции вложенности позволяют создавать пользовательские функции «на лету».

Посмотрите, например, на декораторы . Результирующие функции зависят от переменных, которые связаны во время создания и не нуждаются в дальнейшем изменении. Поэтому использование класса для этой цели будет иметь меньшее значение.

Python - лучший язык программирования в мире.