【问题标题】:Python functions and their __call__ attributePython 函数及其 __call__ 属性
【发布时间】:2012-03-14 18:07:06
【问题描述】:

我使用的是 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与调用foo__call__属性相同。但是,最后三行似乎表明它们是不同的野兽,因为我更改了 __call__ 属性,但它并没有更改调用 foo() 时返回的值。

谁能解释一下调用foo()和调用foo.__call__()之间的关系?有没有办法修改函数的行为,使 foo()foo.__call__() 现在返回 6 而不是 5?

【问题讨论】:

  • 没有理由修改foo.__call__ -- 你可以修改foo
  • 尽管如此,这是一种奇怪的行为。好问题

标签: python


【解决方案1】:

我建议你阅读special method lookup for new-style classes(尤其是最后一段)。

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

【讨论】:

  • 你应该详细说明我们在这里使用函数这一事实并不重要,因为函数是对象并且它们属于一个类 (<type 'function'>) 等等。 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多