在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)
看下面一段代码:
class Descriptor(object): def __get__(self,object,type): print ‘get‘,self,object,type def __set__(self,object,value): print ‘set‘,self,object,value class Demo(object): desc= Descriptor() demo=Demo() demo.desc # get <__main__.Descriptor object at 0x0269BC90> <__main__.Demo object at 0x0269BD50> <class ‘__main__.Demo‘> demo.desc=‘my descriptor‘ #set <__main__.Descriptor object at 0x0269BC90> <__main__.Demo object at 0x0269BD50> my descriptor
其中Descriptor就是一个描述符类,只要实现了__get__等三种方法中一个或几个都是描述符类。
描述符有数据描述符和非数据描述符:
数据描述符:同时实现了__get__和__set__方法的描述符;
非数据描述符:没有实现__set__方法的描述符;
参考资料:
http://blog.csdn.net/imzoer/article/details/8788040
http://blog.csdn.net/yueguanghaidao/article/details/10291147
时间: 2024-12-25 00:17:50