问题 Python函数及其__call__属性


我使用的是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

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

有人可以解释呼叫之间的关系 foo() 并打电话 foo.__call__()?有没有办法修改函数的行为,以便 foo() 以及 foo.__call__() 现在返回6而不是5?


3100
2018-03-14 18:07


起源

永远不会有理由进行修改 foo.__call__  - 你可以修改 foo 代替! - Katriel
尽管如此,这是一种奇怪的行为。好问题 - someone-or-other


答案:


我建议你看看 新样式类的特殊方法查找 (特别是最后一段)。

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


11
2018-03-14 18:10



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