python工厂函数与类相比

mea*_*ade 18 python function

刚刚学习python并开始查看嵌套/工厂函数(简单示例):

def maker(N):
    def action(X):
        return X * N
    return action
Run Code Online (Sandbox Code Playgroud)

工厂功能优于创建类有什么优势吗?性能?记忆?清理?

The*_*ran 27

我最喜欢嵌套函数的是它比类更简洁.您的制造商功能的等效类定义是:

class clsmaker(object):
    def __init__(self, N):
        self.N = N
    def __call__(self, X):
        return X * self.N
Run Code Online (Sandbox Code Playgroud)

在你开始向构造函数添加更多参数之前,这似乎并不那么糟糕.然后以类方式执行它为每个参数获取额外的行,而函数只获取额外的args.

事实证明,嵌套函数也有速度优势:

>>> 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
Run Code Online (Sandbox Code Playgroud)

这可能是由于嵌套函数版本中涉及的操作码更少:

>>> 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  
Run Code Online (Sandbox Code Playgroud)

  • 这是一个重要的时间差异.有趣的结果 (3认同)

Ned*_*der 14

将函数工厂与类进行比较是比较苹果和橙子.如果您有一个紧密的数据和函数集合,则使用一个类,一起称为对象.如果需要函数,请使用函数工厂,并希望参数化其创建.

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


Ste*_*202 5

嵌套函数允许您即时创建自定义函数。

看看例如装饰器。结果函数依赖于在创建时绑定的变量,之后不需要更改。因此,为此目的使用类将没有意义。