python - 无法覆盖 __call__ 的实现

标签 python

以此为例:

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 上重现它

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

这对我来说完全像是一个有效的用例,特别是在 monkeypatching 的时候。

是否有不允许这样做的原因?

最佳答案

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

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

关于python - 无法覆盖 __call__ 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50817015/

相关文章:

python - 如何列出列表中句子中某个单词的索引?我不明白它是如何工作的

python - 如何使用Python下载文件?

python - 尝试运行服务器时出现导入错误

Python 2.7 值错误 : Need more than 0 vales to unpack (Learn Python the Hard Way Ex 41)

python - 如何提取列表中每个元组的 'x' 并以 python 方式连接?

python - 代码在输出末尾留下随机字符串

python - 在 Python 中检索特定的集合元素

python - 如何更新 matplotlib hexbin 图?

python - 为什么我应该使用整数而不是 float ?

python - 使用 PyMongo 将 NumPy rec.array 插入 MongoDB