Python工厂函数与类的比较
这是一个简单的嵌套函数的例子:
def maker(N):
def action(X):
return X * N
return action
工厂函数相比于创建类有什么好处吗?比如性能、内存使用、清理等方面?
3 个回答
6
嵌套函数可以让我们随时创建自定义函数。
你可以看看比如 装饰器。这些生成的函数依赖于在创建时绑定的变量,之后不需要再更改。所以用类来实现这个功能就显得 不太合适。
20
把函数工厂和类进行比较,就像拿苹果和橙子比一样,根本没法比。你应该在有一组相关的数据和功能时使用类,这样它们就可以一起称为一个对象。如果你只需要一个函数,并且想要根据不同的参数来创建它,就可以使用函数工厂。
你选择这两种方法中的哪一种,应该根据代码的具体含义来决定。
29
我最喜欢嵌套函数的地方是,它比类要简洁很多。你可以把你的创建函数换成一个类的定义,样子是这样的:
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