python - 无法覆盖 __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.x和Python 3.x上重现这个
我无法在有关此行为的文档中找到任何相关信息。
这对我来说完全是一个有效的用例,特别是在猴子补丁时。
这是不允许的原因吗?
解决方案
当您使用 调用对象时()
,它会执行__call__
对象类型上定义的方法。所以__call__
是在类上定义的Foo
,而不是在您的实例上foo
。如果你重新分配Foo.__call__
,它会工作。
Foo.__call__ = lambda _: 'bye'
print(foo()) # prints 'bye'
推荐阅读
- ios - 从另一个按钮按下控制按钮的各个方面 - Swift
- regex - 如何从 .htaccess 中的重定向 URL 中删除字符?
- gnuplot - 如何在 gnuplot 条形图中设置条形图的 y 坐标?
- php - Laravel - 使用什么作为会话 ID?
- python - 自动计算 __all__ 以仅使用显式定义的导入
- apache-spark - spark redis键列映射不起作用-返回null
- mediawiki - $_SESSION['mydata'] 在 MW 中消失
- bash - Bash:将 grep 的多行输出传递给另一个循环的命令
- asp.net-core - asp core kendo ui网格不显示数据
- c - 使用 getchar() 和 putchar() 是否安全