Python函数及其__call__属性

Zoo*_*101 12 python

我使用的是Python 2.7.2.我想了解调用函数和调用函数__call__属性之间的关系.例如,请考虑以下代码

def foo():
    return 5
print foo()          # ==> 5
print foo.__call__() # ==> 5

foo.__call__ = lambda : 6
print foo()          # ==> 5
print foo.__call__() # ==> 6
Run Code Online (Sandbox Code Playgroud)

第一条似乎表明调用函数foo与调用__call__属性相同foo.但是,最后三行似乎表明它们是不同的野兽,因为我更改了__call__属性,但它没有改变调用返回的值foo().

有人可以解释通话foo()和通话之间的关系foo.__call__()吗?有没有修改函数的行为,这样的方式foo(),以及foo.__call__()现在返回6而不是5?

gcb*_*zan 12

我建议你阅读新式类的特殊方法查找(特别是最后一段).

对于新式类,只有在对象的类型上定义,而不是在对象的实例字典中,才能保证对特殊方法的隐式调用才能正常工作.

  • 你应该详细说明我们在这里使用函数的事实并不重要,因为函数是对象,并且它们属于一个类(`<type'function'>``)等等.... (2认同)