zoukankan      html  css  js  c++  java
  • 面向对象-描述符

    描述符使用

    Foo接管了Bar的x值,当x值被操作的时候都调用Foo相应的get/set/delete操作

    class Foo:
        def __get__(self,instance,owner):
            print('===>get',instance,owner)
        def __set__(self,instance,value):
            print('===>set',instance,value)
        def __delete__(self, instance):
            print('===>delete',instance)
    
    class Bar:
        x = Foo()
        def __init__(self,n):
            self.x = n
    
    b1 = Bar(10)
    print(b1.__dict__)
    print(Bar.__dict__)
    print(b1.x)
    '''
    ===>set <__main__.Bar object at 0x0000022A4A214D68> 10
    {}
    {'__module__': '__main__', 'x': <__main__.Foo object at 0x0000022A4A214C50>, '__init__': <function Bar.__init__ at 0x0000022A4A1F6C80>, '__dict__': <attribute '__dict__' of 'Bar' objects>, '__weakref__': <attribute '__weakref__' of 'Bar' objects>, '__doc__': None}
    ===>get <__main__.Bar object at 0x0000022A4A214D68> <class '__main__.Bar'>
    None
    '''
    
    class Foo:
        def __get__(self,instance,owner):
            print('===>get',instance,owner)
        def __set__(self,instance,value):
            print('===>set',instance,value)
        def __delete__(self, instance):
            print('===>delete',instance)
    
    class Bar:
        x = Foo()
        def __init__(self,n):
            self.x = n
    
    # print(Bar.x)
    # Bar.x = 1 #不触发描述符,因为类属性优先级更高,如果不注释,后面的语句也不触发描述符
    b1 = Bar(10)
    print(b1.x)
    del b1.x
    '''
    ===>set <__main__.Bar object at 0x000001D368C14CF8> 10
    ===>get <__main__.Bar object at 0x000001D368C14CF8> <class '__main__.Bar'>
    None
    ===>delete <__main__.Bar object at 0x000001D368C14CF8>
    '''
    

    描述符优先级

    1. 类属性
    2. 数据描述符---》至少实现了get、set方法
    3. 实例属性
    4. 非数据描述符 ----》没有set方法
    5. 找不到的属性触发__getattr__()
    class Foo:
        def __get__(self,instance,owner):
            print('===>get',instance,owner)
        def __set__(self,instance,value):
            print('===>set',instance,value)
        def __delete__(self, instance):
            print('===>delete',instance)
    
    class Bar:
        x = Foo()
        def __init__(self,n):
            self.x = n
    
    # print(Bar.x)
    Bar.x = 1 #不触发描述符,因为类属性优先级更高
    '''
    
    Process finished with exit code 0
    '''
    
  • 相关阅读:
    vulnhub靶场 之 DC -1
    PHP反序列化中过滤函数使用不当导致的对象注入
    网络内生安全试验场-CTF答题夺旗赛(第四季)web知识
    BUUCTF 随便注
    SWPUCTF 2019 web
    春秋-SQLi题
    i春秋-“百度杯”CTF比赛 十月场-Login
    i春秋-第三届“百越杯”福建省高校网络空间安全大赛-Do you know upload?
    i春秋CTF-“百度杯”CTF比赛 九月场 XSS平台
    终于等到你,最强 IDE Visual Studio 2017 正式版发布
  • 原文地址:https://www.cnblogs.com/chrrydot/p/9822905.html
Copyright © 2011-2022 走看看