Python属性查找规则


'''
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__ 特殊方法

'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值