python描述器

时间:2023-03-09 23:56:38
python描述器

描述器定义
python中,一个类实现了__get__,__set__,__delete__,三个方法中的任何一个方法就是描述器,仅实现__get__方法就是非数据描述器,同时实现__get__,__set__就是数据描述器
我们来看一下__get__, __set__,__delete__三个魔术方法:
object.__get__(self, instance,owner)
object.__set__(self, instance,owner)
object.__delete__(self, instance)
self 表示当前实例,调用者
instance 是owner的实例
owner 表示属性所属的类
先看一下这个例子:
python描述器
执行结果:
python描述器
我理解的执行顺序是,类加载的时候,类变量就会生成,所以类A会先实例化,输出init A,然后实例化了B类,B的实例调用类属性方法返回A实例的属性a的值
变化一下:
python描述器
执行结果:
python描述器
因为定义的__get__方法,类A就是一个描述器,对B类或者B类实例x属性读取,成为对A的实例的访问,就会调用__get__方法
B.x.a和b.x.a都会报错该如何处理呢?
python描述器
执行结果:
python描述器
这样看应该很明白了吧
再来验证一个问题:
python描述器
执行结果:
python描述器
可以看出只有类属性访问才会出发__get__方法,而类的实例不会触发
我们再来看一下__set__方法,回顾一下属性查找顺序,
实例查找顺序是实例的__dict__,类的__dict__,基类的__dict__
类的查找顺序是类的__dict__,基类的__dict__
python描述器
执行结果
python描述器
实例返回变成实例A的属性,访问到类描述器
官网给出的解释是实例的__dict__优先级高于非数据描述器,数据描述器的优先级高于实例的__dict__,
python描述器
执行结果
python描述器
实例的__dict__是空的,实际上是没有优先级高低这个概念的