Python的:关于__init__ ,__call__

__init__ or __call__?

当我应该使用__init____call__法?

我明白我应该使用无论是第一或第二。

此刻我可以使用他们两个,但我不知道这是更适当的。


这两个完全不同。

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

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

例如:假设我们有一个班,Test

1
2
a = Test() #This will call Test.__init__() (among other things)
a() #This will call Test.__call__()


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

1
2
3
4
5
6
7
8
class Foo(object):
    def __init__(self):
        print"init"
    def __call__(self):
        print"call"

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

这些绝对不能互换


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

1
2
3
4
5
6
7
8
9
10
11
>>> class C(object):
...   def __init__(self):
...     print 'init'
...   def __call__(self):
...     print 'call'
...
>>> c = C()
init
>>> c()
call
>>>

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

1
2
3
4
5
6
7
8
9
>>> class Math:
...     def __init__(self):
...             self.x,self.y=20,30
...     def __call__(self):
...             return self.x+self.y
...
>>> m=Math()
>>> m()
50