Python 的可调用对象是具有__call__
方法的对象。它们大部分时间都是函数,但也可能是类实例。
但碰巧函数确实有__call__
方法。因此,__call__
方法也有__call__
方法。以下 REPL 会话显示我们可以链接__call__
s:
>>> print
<built-in function print>
>>> print.__call__
<method-wrapper '__call__' of builtin_function_or_method object at 0x0000025E2D597F78>
>>> print.__call__.__call__
<method-wrapper '__call__' of method-wrapper object at 0x0000025E2F631438>
>>> print.__call__.__call__.__call__
<method-wrapper '__call__' of method-wrapper object at 0x0000025E2F5F85F8>
>>> print.__call__.__call__.__call__.__call__
<method-wrapper '__call__' of method-wrapper object at 0x0000025E2F725DA0>
... 等等。值得注意的是,所有这些方法都有不同的地址。此外,它们都有相同的行为:
>>> print("a")
a
>>> print.__call__("a")
a
>>> print.__call__.__call__("a")
a
>>> print.__call__.__call__.__call__("a")
那么,当我写的时候print("a")
,实际上叫什么?是print
,还是print.__call__
?如果我Foo
用方法定义一个类__call__
怎么办?
此外,怎么可能每种__call__
方法都有自己不同 __call__
的方法?难道它们实际上是在我尝试访问它们时创建的吗?