我应该何时使用 __init__
方法和 __call__
方法?
我不确定应该使用哪个方法。
目前我两种方法都可以使用,但我不知道哪个更为合适。
我应该何时使用 __init__
方法和 __call__
方法?
我不确定应该使用哪个方法。
目前我两种方法都可以使用,但我不知道哪个更为合适。
这两者完全不同。
__init__()
是构造函数,在对象的新实例上运行。
__call__()
在您尝试调用对象的实例,就像它是一个函数一样时运行。
例如:假设我们有一个名为Test
的类:
a = Test() #This will call Test.__init__() (among other things)
a() #This will call Test.__call__()
__call __()
返回self
,而__init __()
使用相同的参数调用__call __()
。 想象一下tokens = list(Tokenizer(doc, ngrams=2))
与tokenizer = Tokenizer(); tokens = list(tokenizer(doc, ngrams=2))
与list(tokenizer.tokenize(doc, ngrams=2))
是相同的。无论用户喜欢如何使用它,它都可以“正常工作”。 - hobs一个快速测试可以展示它们之间的差异。
class Foo(object):
def __init__(self):
print "init"
def __call__(self):
print "call"
f = Foo() # prints "init"
f() # prints "call"
这些绝对不能互换使用
大多数情况下,您希望使用__init__
。这是用于初始化类的新实例的方法,您通过调用类来创建该实例。 __call__
是为了使您的实例可被调用。虽然偶尔会用到,但并不常见,但这可能是有用的。以下示例应该说明:
>>> class C(object):
... def __init__(self):
... print 'init'
... def __call__(self):
... print 'call'
...
>>> c = C()
init
>>> c()
call
>>>
>>> class Math:
... def __init__(self):
... self.x,self.y=20,30
... def __call__(self):
... return self.x+self.y
...
>>> m=Math()
>>> m()
50