Python:为什么动态添加的__repr__方法不会覆盖默认值

时间:2014-09-26 01:11:00

标签: python

即使在覆盖了原来的 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

2 个答案:

答案 0 :(得分:4)

Special Method Lookup中所述:

  

对于自定义类,只保证在对象的类型上定义特殊方法的隐式调用才能正常工作,而不是在对象的实例字典中定义...除了为了正确性而绕过任何实例属性之外,通常隐式特殊方法查找也绕过对象的元类

__getattribute__()方法

(如果你对此感兴趣的话,我发现的部分解释了这背后的理由。)

Python没有准确记录实现应该或不应该在类型上查找方法的时间;实际上,所有文档实现可能会或可能不会查看特殊方法查找的实例,因此您不应指望它们。

但是,正如您可以从测试结果中猜测的那样,在CPython实现中,__repr__是查找该类型的函数之一。

答案 1 :(得分:1)

__repr__直接在类上查找,而不是在实例上,当它由repr或类似的查找时(例如当它由交互式解释器调用时)。如果您必须修补 repr ,请在课堂上进行(但请不要)。

同样的基本规则适用于大多数dunder方法。