__setattr__可以覆盖Python中的__getattribute__吗?

时间:2013-08-21 20:48:34

标签: python

我有以下代码,它来自O'Reilly Media出版的Learning Python。为什么第3行(self._name = name)不会触发__getattribute__?是因为__setattr__覆盖它吗?

class Person:                               # Portable: 2.X or 3.X
    def __init__(self, name):               # On [Person()]
        self._name = name                   # Triggers __setattr__!

    def __getattribute__(self, attr):                 # On [obj.any]
                print('get: ' + attr)
                if attr == 'name':                         # Intercept all names
                    attr = '_name'                         # Map to internal name
                return object.__getattribute__(self, attr) # Avoid looping here

    def __setattr__(self, attr, value):     # On [obj.any = value]
        print('set: ' + attr)
        if attr == 'name':
            attr = '_name'                  # Set internal name
        self.__dict__[attr] = value         # Avoid looping here

1 个答案:

答案 0 :(得分:4)

设置属性。对属性的分配始终使用__setattr__

只有在查找特定属性的值时才会查询{p> __getattr____getattribute__;在设置时,您没有检索值。

这不是覆盖;即使未定义__setattr____getattribute__方法也不会