以此为例:
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.x 和 Python 3.x 上重现它
我无法在有关此行为的文档中找到任何相关信息。
这对我来说完全像是一个有效的用例,特别是在 monkeypatching 的时候。
是否有不允许这样做的原因?
最佳答案
当您使用 ()
调用对象时,它会执行定义在对象类型上的 __call__
方法。所以 __call__
是在类 Foo
上定义的,而不是在您的实例 foo
上定义的。如果您重新分配 Foo.__call__
,它将起作用。
Foo.__call__ = lambda _: 'bye'
print(foo()) # prints 'bye'
关于python - 无法覆盖 __call__ 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50817015/