首页 > 解决方案 > 无法覆盖 __call__ 的实现

问题描述

以此为例:

class Foo(object):
   def __init__(self, msg):
      self._msg = msg
   def __call__(self):
      return self._msg

foo = Foo('hello')
print(foo()) # Prints 'hello'
foo.__call__ = lambda _: 'bye'
print(foo()) # Prints 'hello'

我可以在Python 2.xPython 3.x上重现这个

我无法在有关此行为的文档中找到任何相关信息。

这对我来说完全是一个有效的用例,特别是在猴子补丁时。

这是不允许的原因吗?

标签: python

解决方案


当您使用 调用对象时(),它会执行__call__对象类型上定义的方法。所以__call__是在类上定义的Foo,而不是在您的实例上foo。如果你重新分配Foo.__call__,它会工作。

Foo.__call__ = lambda _: 'bye'
print(foo()) # prints 'bye'

推荐阅读