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

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

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

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

  • Как я могу получить исходный код функции Python?
  • Что предпочтительнее использовать в Python: лямбда-функции или вложенные функции ('def')?
  • аргумент функции распаковки
  • Имея несколько параметров с def в python
  • Функция Python возвращает None без оператора return
  • Python передает целое число по ссылке
  • Импорт модулей внутри класса python
  • Как группировать записи pandas DataFrame по дате в неузнаваемом столбце
  • алгоритм для python itertools.permutations
  • Безопасен ли объект Session из библиотеки запросов Python?
  • Python: Как создать подкласс из суперкласса?
  • Мини-языки в Python
  • 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 - лучший язык программирования в мире.