You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何通过setattr给实例打猴子补丁修改魔法方法无效?

为什么给实例的魔法方法打猴子补丁不生效?

先看这个示例,x是一个动态创建类的实例:

>>> x = type('someobject', (), {})()
>>> repr(x)
<someobject object at 0x10172d990>

问题来了:为什么给x的魔法方法(比如__repr__)打猴子补丁后,调用repr(x)还是用的原始实现?

>>> setattr(x, '__repr__', lambda self: f'<someobj {id(self)}>')
>>> repr(x)
<someobject object at 0x10172d990>

(仍然输出原始的__repr__结果)

但直接调用实例上的__repr__方法却能得到预期结果:

>>> x.__repr__(x)
<someobj 4319271312>

原因

Python调用魔法方法(双下划线开头结尾的方法)时,会直接从对象的类中查找,而不会去实例的属性字典里找。

比如执行repr(x)时,Python实际是调用type(x).__repr__(x),而非x.__repr__()。所以哪怕你给实例单独加了__repr__属性,解释器也会跳过它,去类层面找对应的方法。

解决办法

如果要让猴子补丁生效,得把方法加到实例的类上,而不是实例本身:

>>> setattr(type(x), '__repr__', lambda self: f'<someobj {id(self)}>')
>>> repr(x)
<someobj 4319271312>

内容的提问来源于stack exchange,提问作者fferri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:23:19