即使在覆盖了原来的 repr 方法之后,python还是在哪里获得仍然会产生'foo'的repr?
class Test(object):
def __init__(self, name, number_array):
self.name = name
self.number_array = number_array
def __repr__(self):
return str(self.name)
def custom_repr(self):
return str(self.name*4)
>>> A = Test('foo', [1,2])
>>> A
foo
>>> A.__repr__ = custom_repr.__get__(A, A.__class__)
>>>A.__repr__()
foofoofoofoo
>>>A
foo
答案 0 :(得分:4)
对于自定义类,只保证在对象的类型上定义特殊方法的隐式调用才能正常工作,而不是在对象的实例字典中定义...除了为了正确性而绕过任何实例属性之外,通常隐式特殊方法查找也绕过对象的元类
的__getattribute__()
方法
(如果你对此感兴趣的话,我发现的部分解释了这背后的理由。)
Python没有准确记录实现应该或不应该在类型上查找方法的时间;实际上,所有文档实现可能会或可能不会查看特殊方法查找的实例,因此您不应指望它们。
但是,正如您可以从测试结果中猜测的那样,在CPython实现中,__repr__
是查找该类型的函数之一。
答案 1 :(得分:1)
__repr__
直接在类上查找,而不是在实例上,当它由repr
或类似的查找时(例如当它由交互式解释器调用时)。如果您必须修补 repr ,请在课堂上进行(但请不要)。
同样的基本规则适用于大多数dunder方法。