python工厂函数与类的比较

2024-06-14 01:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

只是学习python并开始研究嵌套/工厂函数(简单示例):

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

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


Tags: 记忆函数示例return工厂defactionmaker
3条回答

我最喜欢嵌套函数的地方是它比类更不冗长。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  

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

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

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

看看例如decorators。生成的函数依赖于在创建时绑定的变量,这些变量在创建后不需要更改。因此,为此目的使用一个类将使变得不那么有意义。

相关问题 更多 >