python属性查找顺序

 1 import numbers
 2 
 3 class IntField:
 4     # 数据描述符
 5     def __get__(self, instance, owner):
 6         return self.value
 7 
 8     def __set__(self, instance, value):
 9         if not isinstance(value, numbers.Integral):
10             raise ValueError('int value need')
11         if value < 0:
12             raise ValueError('positive value need')
13         self.value = value
14 
15     def __delete__(self, instance):
16         pass
17 
18 class NonDataIntField:
19     # 非数据属性描述符
20     def __get__(self, instance, owner):
21         return self.value
22 
23 class User:
24     # age = IntField()
25     age = NonDataIntField()
26 
27 if __name__=='__main__':
28     user = User()
29     user.__dict__['age'] = 'abc'
30     print(user.__dict__)
31     print(getattr(user, 'age'))

输出:

{'age': 'abc'}
abc

查找顺序:

先查找__getattribute__: 

  1.查找数据描述符__get__

  2.查找实例__dict__

  3.查找基类

    若是非数据描述符访问其__get__

    否则查找基类__dict__

没找到再查找__getattr__

否则抛出异常AttributeError

转载于:https://www.cnblogs.com/icekx/p/9188211.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值