Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python工厂函数与类的比较

python工厂函数与类的比较
EN

Stack Overflow用户
提问于 2009-05-23 08:43:25
回答 3查看 13.8K关注 0票数 19

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

代码语言:javascript
运行
AI代码解释
复制
def maker(N):
    def action(X):
        return X * N
    return action

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-23 09:38:58

我最喜欢嵌套函数的是它比类更少的冗长。与maker函数等效的类定义为:

代码语言:javascript
运行
AI代码解释
复制
class clsmaker(object):
    def __init__(self, N):
        self.N = N
    def __call__(self, X):
        return X * self.N

在您开始向构造函数添加更多参数之前,这看起来并不是很糟糕。然后,类方法为每个参数额外添加一行,而函数只获取额外的参数。

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

代码语言:javascript
运行
AI代码解释
复制
>>> 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

这可能是因为嵌套函数版本中涉及的操作码较少:

代码语言:javascript
运行
AI代码解释
复制
>>> 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  
票数 28
EN

Stack Overflow用户

发布于 2009-05-23 16:55:57

将函数工厂比作类就像是在比较苹果和橙子。如果您有一个数据和函数的内聚集合,则可以使用类,这些集合一起称为对象。如果你需要一个函数,并且想要参数化它的创建,那么可以使用函数工厂。

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

票数 16
EN

Stack Overflow用户

发布于 2009-05-23 08:49:18

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

例如,看看decorators。生成的函数依赖于在创建时绑定的变量,并且不需要在以后进行更改。因此,使用类来实现此目的意义不大。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/901892

复制
相关文章

相似问题

用VisualVM监控Java应用程序

10

用网站制作Android应用程序

21

用Java监控流量

22

用Java小程序制作蛇

14

用Java监控google搜索

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档