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