Python __是初始化还是调用?
我应该在什么时候使用Python __是初始化还是调用?,python,Python,我应该在什么时候使用\uuuuu init\uuuuu和什么时候使用\uuuu call\uuuu方法 我不知道我应该用第一个还是第二个 目前我可以同时使用它们,但我不知道哪一种更合适。这两种完全不同 \uuuu init\uuuu()是构造函数,它在对象的新实例上运行 \uuuuu call\uuuuu()在尝试调用对象实例时运行,就像调用函数一样 例如:假设我们有一门课,Test: a = Test() #This will call Test.__init__() (among other
\uuuuu init\uuuuu
和什么时候使用\uuuu call\uuuu
方法
我不知道我应该用第一个还是第二个
目前我可以同时使用它们,但我不知道哪一种更合适。这两种完全不同
\uuuu init\uuuu()
是构造函数,它在对象的新实例上运行
\uuuuu call\uuuuu()
在尝试调用对象实例时运行,就像调用函数一样
例如:假设我们有一门课,Test
:
a = Test() #This will call Test.__init__() (among other things)
a() #This will call Test.__call__()
快速测试显示了它们之间的差异
class Foo(object):
def __init__(self):
print "init"
def __call__(self):
print "call"
f = Foo() # prints "init"
f() # prints "call"
在任何情况下,这些都不是可互换的最有可能的情况是,您希望使用
\uuuu init\uuuu
。这是用于初始化类的新实例的方法,您可以通过调用该类来创建该实例<代码>\uuuu调用\uuuu是为了防止您希望使实例可调用。这不是经常做的事情,尽管它可能很有用。这个例子应该说明:
>>> 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
那么,你想做什么?你可以同时使用它们,并实现它们。如果你不告诉我们你想做什么,我们怎么帮你?你觉得文档很混乱吗?混淆了哪个部分?相关:可能重复的,除非它们是相同的。。。我构建了可调用的惰性字符串标记器类。为了保持实现的干爽并为用户提供等效的API,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。想象一下tokens=list(Tokenizer(doc,ngrams=2))
与Tokenizer=Tokenizer()相同;tokens=list(tokenizer(doc,ngrams=2))
与list(tokenizer.tokenize(doc,ngrams=2))相同。
无论用户喜欢如何使用它,它都“正常工作”。@hobs,很好的例子!为什么不把它作为一个答案呢?至于@hobs的建议,值得注意的是这是一个非常罕见的用例。总的来说,我想不出有多少情况下你需要这种行为——使用某种东西的单一一致的方式通常比使用多种方式要好,因为它使代码更容易阅读。@GarethLatty这是一个很好的观点。不是很像蟒蛇。只有当你有很好的理由时,才按照我的建议去做。我这么做只是为了模仿NLTK软件包。具有大量API更新的长寿命包往往有很多方法来做同样的事情,特别是对于需要作为配置对象传递的可调用类,如标记器,在管道中作为函数调用,以配置形式进行pickle/depickle,作为参数传递给期望可调用的对象,等等。