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,作为参数传递给期望可调用的对象,等等。