为何Python中repr()未调用自定义的__repr__方法?
问题原因
Python中像__repr__这类特殊方法(魔术方法),其查找逻辑是直接从类对象中获取,而非优先查找实例的属性字典。当调用repr(x)时,Python会直接去X类的命名空间里寻找__repr__方法,完全忽略你绑定在实例x上的同名方法。而直接调用x.__repr__()时,是直接访问实例的属性,因此能正常执行你定义的lambda函数。
解决方案
方案1:类中定义转发方法
在类里实现__repr__,让它调用实例上的自定义逻辑,既不用保存x为实例属性,也能让repr()正常工作:
class X: def __init__(self, x): # 用闭包捕获x的值,绑定为实例的自定义方法 self._custom_repr = lambda: f'X({x=})' def __repr__(self): return self._custom_repr()
测试示例:
x = X(1) print(repr(x)) # 输出: X(x=1) print(x.__repr__()) # 输出: X(x=1)
方案2:动态修改类的__repr__(不推荐)
如果非要给实例绑定方法,也可以通过修改类的__repr__来实现,但这种方式会影响所有实例,仅适合单实例场景:
from types import MethodType class X: def __init__(self, x): def custom_repr(_): return f'X({x=})' # 替换类的__repr__为当前实例绑定的方法 self.__class__.__repr__ = MethodType(custom_repr, self)
内容的提问来源于stack exchange,提问作者Howard Lovatt
相关产品推荐
相关产品推荐

