• 2019年9月8日 描述符,代理,优先级VIP


    class Foo:
        def __set__(self, instance, value):#由于Foo代理x,所以触发了set方法
            print('set方法',instance,value)#instance传递的就是 b1
            instance.__dict__['x']=value#底层实现赋值,如果没有这句,那么b1.__dict__ 打印出来就是空。
    
    class Bar:
        x=Foo()#Foo() 代理了x
        def __init__(self,n):
            self.x=n
    
    b1=Bar(10)
    b1.x=22
    print(b1.x)
    print(b1.__dict__)

    》》》

    set方法 <__main__.Bar object at 0x02D90A30> 10
    set方法 <__main__.Bar object at 0x02D90A30> 22
    22
    {'x': 22}

    描述符注意事项

    class Foo:
        def __set__(self, instance, value):
            print('set方法')
    
        def __get__(self, instance, owner):
            print('get方法')
    
        def __delete__(self, instance):
            print('delete方法')
    
    
    class Bar:
        x=Foo()#描述符
    
    # print(Bar.__dict__)
    # Bar.x=1  #赋值时定义类属性
    # print(Bar.__dict__)
    # print(Bar.x)
    
    b1=Bar()
    print(b1.__dict__) #对应的属性字典为空
    b1.x=2# 先找属性字典,没找到后再找数据描述符,最后是实例属性

    >>>>

    {}
    set方法

    __get__,__set__,__delete__描述就是一个新式类,这个类必须至少实现上面的三个中的一个。

    别人的类中去定义的。

    class 类:

      name=描述符()

    obj=类()

    obj.name #触发__get__

    obj.name='xxxx' #触发__set__

    del obj.name #触发__delete__

  • 相关阅读:
    二叉树的存储结构
    面试Java需要的知识总结
    EJB总结
    WEB 容器、WEB服务和应用服务器的区别与联系
    Linux安装JBOSS
    JBOSS和WebLogic区别
    深入浅出JMS(一)--JMS基本概念
    Java缓冲流细节
    xor和路径(codevs 2412)
    外星千足虫(bzoj 1923)
  • 原文地址:https://www.cnblogs.com/python1988/p/11488464.html
Copyright © 2020-2023  润新知