'''
Instance access
I.x 将搜索实例,实例的类,及其超类
1、 data descriptor
2、 instance attributes
3、 non-data descriptors and class attributes
4、 __getattr__()
1、 从类字典中查找属性, 当前类中没找到,则按照MRO顺序继续查找,
如果还是没找到, 执行下一步; 如果找到了, 就检查是否data descriptor, 如果不是, 执行下一步
如果是data descriptor, 就调用该descriptor的__get__()方法, 返回结果, 如果没有__get__()方法, 执行下一步
2、从实例instance的属性字典(或者slots)中查找
3、从类的属性字典查找, 按照MRO顺序, 如果找到, 检查是否non-data descriptor, 如果是, 就调用该descriptor的__get__()方法, 返回结果
4、检查__getattr__()是否有自定义属性访问逻辑, 如果没有, 抛出 AttributeError异常
'''
'''
class access
C.x 将搜索类C, C的超类, C的元类
1、搜索C.__class__.__mro__中所有元类的__dict__, 如果是 data descriptor, 调用返回并退出
2、搜索C.__mro__ 中所有类的__dict__, 如果是描述器就调用返回,如果是普通属性,直接返回
3、继续查找步骤1的搜索结果, 如果是non data descriptor, 调用返回并退出, 如果是普通属性,直接返回
'''
'''
注:内置操作只会搜索第一步, 一般指 __xxx__ 特殊方法
'''
Python属性查找规则
于 2022-04-08 17:25:33 首次发布