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

python中descriptor(描述器)就是这么回事

时间:2014-10-09 03:19:08      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:descriptor   python   描述器   

很多教程往往把descriptor说的很复杂,长篇大文,洋洋洒洒,结果很多人看的云里雾里.

其实就一句话,对类的操作进行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(描述器)就是这么回事

标签:descriptor   python   描述器   

原文地址:http://blog.csdn.net/handsomekang/article/details/39895871

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