python描述符,,在Python中,访


在Python中,访问一个属性的优先级顺序按照如下顺序:
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符
5.__getattr__()方法。

描述符,用一句话来说,就是将某种特殊类型的类的实例指派给另一个类的属性(注意:这里是类属性,而不是对象属性)。而这种特殊类型的类就是实现了__get__,__set__,__delete__的新式类(即继承object)。

阐述下这三个方法:

__get__的标准定义是__get__(self,obj,type=None),第一个函数是调用它的实例,obj是指去访问属性所在的方法,最后一个type是一个可选参数,通常为None(这个有待于进一步的研究)

例如给定类X和实例x,调用x.foo,等效于调用:

type(x).__dict__["foo"].__get__(x,type(x))

调用X.foo,等效于调用:

X.__dict__[‘foo‘].__get__(None,X)

如果super()被调用了,比如,给定Y 为X 的子类,然后用super(Y,obj).foo调用,等效于调用:

X.__dict__[‘foo‘].__get__(obj,X)

看下面一段代码:

classDescriptor(object):def__get__(self,object,type):print‘get‘,self,object,typedef__set__(self,object,value):print‘set‘,self,object,valueclassDemo(object):desc=Descriptor()demo=Demo()demo.desc#get<__main__.Descriptorobjectat0x0269BC90><__main__.Demoobjectat0x0269BD50><class‘__main__.Demo‘>demo.desc=‘mydescriptor‘#set<__main__.Descriptorobjectat0x0269BC90><__main__.Demoobjectat0x0269BD50>mydescriptor

其中Descriptor就是一个描述符类,只要实现了__get__等三种方法中一个或几个都是描述符类。

描述符有数据描述符和非数据描述符:

数据描述符:同时实现了__get__和__set__方法的描述符;

非数据描述符:没有实现__set__方法的描述符;

参考资料:

http://www.geekfan.net/7862/

http://blog.csdn.net/imzoer/article/details/8788040

http://blog.csdn.net/yueguanghaidao/article/details/10291147

python描述符

评论关闭