__init__ or __call__?
当我应该使用__init__当__call__法?
我明白我应该使用无论是第一或第二。
此刻我可以使用他们两个,但我不知道这是更适当的。
- 你想做什么?
- 您可以同时使用它们,并同时实现它们。如果你不告诉我们你想做什么,我们该怎么做?您是否发现文档令人困惑?哪个部分不清楚?
- 相关:stackoverflow.com/questions/9663562/…
- 在python中,init和call的区别可能是什么?
这两个完全不同。
__init__()是构造函数,它在对象的新实例上运行。
当您试图像函数一样调用对象的实例时,会运行__call__()。
例如:假设我们有一个班,Test:
1 2
| a = Test() #This will call Test.__init__() (among other things)
a() #This will call Test.__call__() |
- 我现在明白了,谢谢!
- 除非它们是一样的…我构建了懒惰的字符串标记器类,这些类是可调用的iterables。为了使实现保持干燥并为用户提供等效的API,__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建议,值得注意的是这是一个非常罕见的用例。总的来说,我想不出你想要这种行为的很多情况——使用某个东西的单一一致的方法通常比使用很多方法要好,因为它使代码更容易阅读。
- @加勒泰蒂说得对。不是很像Python。只有在你有充分的理由的情况下,才按我的建议去做。我只是模仿NLTK软件包。具有大量API更新的长寿命包往往有很多方法来做相同的事情,特别是对于需要作为配置对象传递的可调用类(如标记化器)、作为管道中的函数调用的、以配置形式pickled/depickled的、作为期望可调用对象的参数传递的等。
一个快速的测试显示了它们之间的区别
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 |