zoukankan      html  css  js  c++  java
  • Python类总结-描述符__get__(),__set__(),__delete__()

    1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),set(),delete()中的一个,这也被称为描述符协议
    get():调用一个属性时,触发
    set():为一个属性赋值时,触发
    delete():采用del删除属性时,触发

    class Foo:
        def __get__(self,instance,owner):
            print("=====>get方法")
        def __set__(self,instance,value):
            print("=====>set方法",instance, value)
            instance.__dict__['x'] = value
        def __delete__(self,instance):
            print("=====>set方法")
    
    class Bar:
        x = Foo() #描述符,对x对象属性的调用去找Foo对象
        def __init__(self,n):
            self.x = n
    b1 = Bar(10) #首先触发Bar的__init__函数, 传入x参数, x参数被Foo代理, 
                # 触发Foo的x方法,触发Foo的set方法
    print(b1.__dict__)
    print(Bar.__dict__)
    b1.x = 11111111
    print(b1.__dict__)
    
    >>>
    =====>set方法 <__main__.Bar object at 0x01F91370> 10
    {'x': 10}
    {'__module__': '__main__', 'x': <__main__.Foo object at 0x01F91250>, '__init__': <function Bar.__init__ at 0x01EBCC48>, '__dict__': <attribute '__dict__' of 'Bar' objects>, '__weakref__': <attribute '__weakref__' of 'Bar' objects>, '__doc__': None}
    =====>set方法 <__main__.Bar object at 0x01F91370> 11111111
    {'x': 11111111}
    
    
    1. 注意事项:
      一 描述符本身应该定义成新式类,被代理的类也应该是新式类
      二 必须把描述符定义成这个类的类属性,不能为定义到构造函数中
      三 要严格遵循该优先级,优先级由高到底分别是
    2. 类属性 (类属性高于数据描述符)
    3. 数据描述符 (get, set)
    4. 实例属性
    5. 非数据描述符(没有set方法)
    6. 找不到的属性触发__getattr__()
  • 相关阅读:
    svn不提交.net项目中的bin
    java 与C# 时间格式 交互
    生成菜单序列号
    ashx 方法模板
    webservice使用方法
    如何配置IIS服务器?
    zepto.fullpage
    模拟单选框
    star score
    Hover show tips
  • 原文地址:https://www.cnblogs.com/konglinqingfeng/p/9660431.html
Copyright © 2011-2022 走看看