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__()
原文地址:https://www.cnblogs.com/konglinqingfeng/p/9660431.html