码迷,mamicode.com
首页 > 编程语言 > 详细

python描述符

时间:2015-07-06 21:54:24      阅读:191      评论:0      收藏:0      [点我收藏+]

标签: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)

看下面一段代码:

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://www.geekfan.net/7862/

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

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

python描述符

标签:python

原文地址:http://wangyongbin.blog.51cto.com/8964308/1671434

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!