python工厂函数与类的比较

python工厂函数与类的比较,python,function,Python,Function,正在学习python,并开始学习嵌套/工厂函数(简单示例): 工厂函数比创建类有什么优势吗?演出记忆?清理?嵌套函数允许用户动态创建自定义函数 看一看。生成的函数依赖于在创建时绑定的变量,以后不需要更改。因此,将类用于此目的的意义不大。我最喜欢嵌套函数的地方是它比类更详细。maker函数的等效类定义为: class clsmaker(object): def __init__(self, N): self.N = N def __call__(self, X):

正在学习python,并开始学习嵌套/工厂函数(简单示例):


工厂函数比创建类有什么优势吗?演出记忆?清理?

嵌套函数允许用户动态创建自定义函数


看一看。生成的函数依赖于在创建时绑定的变量,以后不需要更改。因此,将类用于此目的的意义不大。

我最喜欢嵌套函数的地方是它比类更详细。maker函数的等效类定义为:

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  

将函数工厂与类进行比较就是比较苹果和桔子。如果您有一个内聚的数据和函数集合(称为对象),请使用类。如果需要函数并希望参数化其创建,请使用函数工厂


您对这两种技术的选择应该取决于代码的含义。

这是一个显著的时差。有趣的结果
>>> 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