官方文档
定义和介绍
描述符(descriptor)是一个“绑定行为”的对象的属性;
绑定行为,即绑定了方法
“绑定行为”指的是绑定以下三个方法:
__get__()
__set__()
__delete__()
如果一个对象定义了以上三个方法中的任意一个,那么该对象就是一个描述符;
使用
方法、类方法、静态方法以及property等都用到了
描述符协议
描述符协议,即绑定的三个方法
- 数据描述符:只定义了
__get__
方法 - 非数据描述符:定义了
__set__
或__delete__
方法
数据描述符和非数据描述符的区别主要在与如何根据实例字典中的条目计算重,,即当实例的
__dict__
中有一个条目与描述符相同时,若该描述符为数据描述符,访问该属性时,数据描述符优先;
若该描述符为非数据描述符,访问该属性时,实例__dict__
优先;
- 将属性设置为只读模式:设置
__set__
抛出AttributeError
__get__(self, obj, type=None) -> value
__set__(self, obj, value) -> None
__delete__(self, obj) -> None
调用描述符
通过名称直接调用
d.__get__(obj)
通过属性调用
这时调用细节取决于调用者(即obj)是一个对象还是一个类
比如b=B()
对象调用
即实例
请参考python 类 对象属性访问顺序
实现机制在object.__getattribute__()
中通过type(b).__dict__['x'].__get__(b, type(b))
来实现;
类调用
即是class类
实现机制在type.__getattribute__()
中通过B.__dict__['x'].__get__(None, B)
来实现;
实例
1 |