python 再访问属性的方法上定义了__getattr__() 和 __getattribute__() 2种方法,其区别非常细微,但非常重要。
- 如果某个类定义了
__getattribute__()
方法,,在 每次引用属性或方法名称时 Python 都调用它(特殊方法名称除外,因为那样将会导致讨厌的无限循环)。 - 如果某个类定义了
__getattr__()
方法,找不到的时候再去访问,Python 将只在正常的位置查询属性时才会调用它。如果实例 x 定义了属性 color,x.color
将 不会 调用x.__getattr__('color')
;而只会返回 x.color 已定义好的值。