python 属性查找过程
如果 user 是某个累的实力,那么 user.age (以及等价的getattr(user,‘age’)) 首先会调用 __getattribute__ 。如果定义的__getattr__ 方法,那个在 __getattribute__ 抛出 AttrbuteError 的时候会调用 __getattr__ ,为对于描述符 __get__ 的调用,则是发生在 __getattribute__ 的内部。
user = User(), 那么user.age 顺序如下:
- 如果 ‘age’ 是出现在 User 或者他的基类的 __dict__ 中, 且 age是 data descriptor(数据描述符),那么调用其 __get__ 方法
- 如果 ‘age’ 是出现在 obj 的 __dict__ 中, 直接返回 obj. __dict__[‘age’]
- 如果‘age’ 出现在User 或者其基类的 __dict__ 中
- 如果 age 是 non-data descriptor, 那么调用其 __get__ 方法, 否则 ->返回 __dict__[‘age’]
- 如果 User 有 __getattr__ 方法,调用 __getattr__ 方法 否则抛出AttrbuteError