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

Добавить:

<argument type="service" id="service_container" />

И в вашем классе слушателя:

use Symfony\Component\DependencyInjection\ContainerInterface;

//...

public function __construct(ContainerInterface $container, ...) {
18
задан Stephan202 23 May 2009 в 16:46
поделиться

3 ответа

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

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  
27
ответ дан 30 November 2019 в 06:51
поделиться

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

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

14
ответ дан 30 November 2019 в 06:51
поделиться

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

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

3
ответ дан 30 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: