2009-05-23 2 views
17

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

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

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

ответ

24

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

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 
+3

это существенная разница во времени..интересные результаты – meade

2

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

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

13

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

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