Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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  

Ответ 2

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

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

Ответ 3

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

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