编程

python描述符相关和属性查找策略

2018-10-04  本文已影响0人  LittleTrue

描述符(descriptor)

描述符的作用是用来代理一个类的属性,需要注意的是描述符不能定义在类的构造函数中,只能定义为类的属性,它只属于类的,不属于实例,我们通过查看实例和类的字典即可知晓。

只要类重写任何下面的一个方法,类就被看作是descriptor,当这些descriptor在另外一个类中作为属性被访问时, 就可以不去采用默认的查找属性的顺序。

两种种类的描述符

数据描述符(data descriptor)和非数据描述符(non-data descriptors)

数据描述符:定义了setget方法的对象
非数据描述符:只定义了get方法的对象。

非数据描述符在python中

通常方法都是非数据描述符。比如后面会谈到的staticmethod,classmethod等。

此利用描述符的原理,我们完全可以自定义模拟@classmethod、@staticmethd、@property、等属性。实现这种类似系统的属性,我们还需要装饰器作为修饰 。

例如:(使用装饰器@的结果等价于将函数变为属性:)
声明非数据描述符descriptor_classmethod
@descriptor_classmethod,结合装饰器做成一个系统描述符。
参考


属性查找策略:

在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候。

大致优先级如下:

__dict__属性 > 数据描述符 > 实例__dict__属性 > 非数据描述符 > 找不到的属性触发getattr()

通过实例。访问属性时,__getattribute__内部的搜索逻辑:

注意: 数据描述符永远是针对类来说的, 所以实例访问触发的__getattribute__第一步不会搜索实例obj的__dict__中attr是否data descriptor, 而是去搜索其类或其父/超类。

通过类名。访问属性时的搜索逻辑(不知道此时会不会调用getAttribute):
上一篇下一篇

猜你喜欢

热点阅读