• 飘逸的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错误.这就是描写叙述器的作用.
    


  • 相关阅读:
    Hive的架构和工作流程
    Hive的定义及搭建
    HBase API操作
    HBase相关概念简介
    HBase shell常用命令
    HBase的简介和搭建
    scrapy useragent
    scrapy settings
    scrapy中的request对象
    python语法
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6729825.html
Copyright © 2020-2023  润新知