描述器的表现:
用到了三个魔术方法:__get__(),__set__(),__delete__()
方法签名如下:
- object.__get__(self,instance,owner)
- object.__set__(self,inatance,value)
- object.__delete__(self,instance)
self指代当前实例,调用者
instance 是owner的实例
owner是属性的所属的类
描述器定义:
Python中,一个类实现了,__get__,__set__,__delete__,三个方法中的任何一个方法,就是描述器。
如果仅实现了__get__,就是非数据描述符 non-data descriptor;
同时实现了,__get__,__set__,就是数据描述符 data descriptor。
如果一个类的属性设置为描述器实例,那么他被称为owner属主。
属性的访问顺序:
属性查找顺序:实例的,__dict__,优先于 非数据描述器,数据描述器 优先于实例的__dict__
__delet__,方法偶同样的效果,有了这个方法,也是数据描述器
Python中的描述器:
描述器在python中应用非常广泛。
Python的方法(包括staticmenthod()和classmenthod())都实现为非数据描述器,因此,实例可以重新定义和覆盖方法。这单个实例获取与同一类的其他实例不同的行为。
property()函数实现为一个数据描述器。因此,实例不能覆盖属性的行为。