飘逸的python - descriptor(描述器)就是这么回事
2014-10-08 17:13
507 查看
很多教程往往把descriptor说的很复杂,长篇大文,洋洋洒洒,结果很多人看的云里雾里.
其实就一句话,对类的操作进行hook,以此控制行为.
大部分时候是用来拦截对实例属性的访问。
只要类中有__get__(), __set__(), 和 __delete__()其中之一的方法.那么它就是一个描述器.我们想一想,对一个类进行操作,逃不开这三种方法,我们需要控制什么操作,就hook哪个方法.
描述器不是self host的,而是寄生在其它类中.
property, classmethod, staticmethod, super的实现原理正是描述器.
说这么多,下面用代码展示,相信一清二楚.
其实就一句话,对类的操作进行hook,以此控制行为.
大部分时候是用来拦截对实例属性的访问。
只要类中有__get__(), __set__(), 和 __delete__()其中之一的方法.那么它就是一个描述器.我们想一想,对一个类进行操作,逃不开这三种方法,我们需要控制什么操作,就hook哪个方法.
描述器不是self host的,而是寄生在其它类中.
property, classmethod, staticmethod, super的实现原理正是描述器.
说这么多,下面用代码展示,相信一清二楚.
#coding=utf-8 class Integer(object):#Integer就是一个描述器,因为定义了__set__()方法. def __init__(self, name): self.name = name def __set__(self, instance, value):#因为我们只需要对"修改属性"这个行为进行hook,所以我们只定义__set__()方法就够了,不用__get__()和__delete__(). if not isinstance(value, int): raise TypeError('Expected an int') instance.__dict__[self.name] = value class Point(object): x = Integer('x') y = Integer('y') def __init__(self, x, y): self.x = x self.y = y p = Point(2, 3) p.x = 9 p.x = 9.9#这句会抛出TypeError: Expected an int错误.这就是描述器的作用.
相关文章推荐
- python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
- javaScript就是这么回事
- Netty就是这么回事(二)
- Netty就是这么回事(九)
- Netty就是这么回事(八)
- JS就是这么回事
- Netty就是这么回事(一)
- Netty就是这么回事(三)
- 学了Python后,我走哪里都可以连WIFI!为什么?反正就是这么强!
- 解密Python中的描述符(descriptor)
- Python 的描述符 descriptor详解
- Python 的描述符 descriptor详解
- Netty就是这么回事(四)
- Python 黑魔法 --- 描述器(descriptor)
- python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
- 关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事
- Python 描述符(descriptor) 杂记
- Netty就是这么回事(五)
- Python 黑魔法 --- 描述器(descriptor)
- Python 描述符(Descriptor)入门