2012-04-23 86 views
16

在Python中你可以调用实例通过实现__call__方法。例如当我应该实现__call__

class Blah: 
    def __call__(self): 
     print "hello" 

obj = Blah() 
obj() 

但我也能实现自己的方法,说“跑”:

class Blah: 
    def run(self): 
     print "hello" 

obj = Blah() 
obj.run() 

我什么时候应该实现__call__

+9

当它是有道理的。 – 2012-04-23 20:39:50

+12

如果您不确定是否需要'__call__',那么您不需要'__call__'。 – 2012-04-23 20:47:08

回答

19

这是很难回答。我的意见是,除非你的实际目标是创建一个功能,否则你不应该定义__call__。这不是你在创建传统对象后应该做的事情。

换句话说,如果你开始想:“我要创建一个对象”你永远不应该结束了实施__call__。另一方面,如果你开始思考“我要创建一个函数......但我希望我可以使用对象框架让我的函数有一些状态”,那么你可以创建函数作为一个对象状态,并定义__call__以使其充当功能。

我想包括由@Paul Manta在评论的问题,在那里他写了建议的最后一个位:

如果你不确定,如果你需要__call__,那你就不要需要__call__

我认为这是很好的建议。

+0

+1 - 有时候闭包变成了一个无法形容的混乱,而可调用的对象是更好的方法。但就是这样。 – detly 2012-04-24 00:39:48

相关问题