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

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

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

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

  • Изменить атрибут функции внутри своего тела?
  • Python: как вызвать длинную функцию, содержащую сотни списков в краткой форме
  • Изменение списка в python путем передачи его функции
  • Программно определяющее количество параметров, которые требуется функции - Python
  • Python: передача имени класса в качестве параметра функции?
  • Вызов функции из строки внутри одного модуля в Python?
  • Как преобразовать строку в функцию в python?
  • Функция для вращения 2d объектов?
  • 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 - лучший язык программирования в мире.