0

我有以下代码,它来自 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
4

1 回答 1

4

您正在设置一个属性。对属性的赋值总是使用__setattr__.

__getattr__并且__getattribute__仅在查找特定属性的值时被咨询;设置时您没有检索值。

这不是覆盖;即使__setattr__没有定义,也不会__getattribute__参考该方法。

于 2013-08-21T20:50:24.947 回答