9

我应该什么__init__时候使用什么__call__方法?

我很困惑我应该使用第一个还是第二个。

目前我可以同时使用它们,但我不知道哪个更合适。

4

4 回答 4

20

这两个是完全不同的。

__init__()是构造函数,它在对象的新实例上运行。

__call__()当您尝试像调用函数一样调用对象的实例时运行。

例如:假设我们有一堂课,Test

a = Test() #This will call Test.__init__() (among other things)
a() #This will call Test.__call__()
于 2012-12-31T16:34:35.657 回答
9

快速测试显示它们之间的区别

class Foo(object):
    def __init__(self):
        print "init"
    def __call__(self):
        print "call"

f = Foo()  # prints "init"
f()        # prints "call"

这些绝不是可以互换的

于 2012-12-31T16:35:24.200 回答
7

最有可能的是,您想使用__init__. 这是用于初始化类的新实例的方法,您可以通过调用该类来创建该实例。__call__如果您想让您的实例可调用。这不是经常做的事情,尽管它可能很有用。这个例子应该说明:

>>> class C(object):
...   def __init__(self):
...     print 'init'
...   def __call__(self):
...     print 'call'
... 
>>> c = C()
init
>>> c()
call
>>> 
于 2012-12-31T16:36:08.740 回答
2

一个简单的代码片段将更好地阐述这一点。

>>> class Math:
...     def __init__(self):
...             self.x,self.y=20,30
...     def __call__(self):
...             return self.x+self.y
... 
>>> m=Math()
>>> m()
50
于 2017-12-28T08:42:35.820 回答