• __setattr__,__getattr__,__delattr__


    class Foo:
        x = 1
        def __init__(self,y):
            self.y = y
        def __getattr__(self,item):
            print("---->from getattr:你找的属性不存在")
        def __setattr__(self,key,value):
            print('----> from setattr')
            # self.key = value # 这样就无限递归
            # self.__dict__[key] = value #应该这样写
        def __delattr__(self,item):
            print("---> from delattr")
            # del self.item
            # 上面的写法同样会无限递归
            self.__dict__.pop(item)
        def __getitem__(self,item):
            print('---->from getitem')
        def __setitem__(self,item,value):
            print('---from setitem')
        def __delitem__(self,item):
            print('---->from __delitem__')
    # __setattr__:添加/修改属性就会触发它的执行
    # 写的原理就是将属性和值写进对象的底层字典中,而我们重新写了
    # __setattr__ 方法,所以不会写进去底层字典。
    f1 = Foo(10)
    f1['y'] = 10  # 触发__setitem__ 方法
    print(f1.__dict__)
    print(f1.__dict__)
    f1.z = 3 # # 触发__setattr__
    print(f1.__dict__)
    # 除非是直接对底层字典进行操作,否则我们是永远无法赋值
    f1.__dict__['z'] = 3
    print(f1.z) # 3
    # 此时f1 就有了z 属性
    # __delattr__删除属性的时候会触发
    f1.__dict__['a'] = 5
    print(f1.__dict__) #{'z': 3, 'a': 5}
    del f1.a # 触发__delattr__方法
    del f1['a'] # 触发__delitem__方法
    print(f1.__dict__) # {'z': 3}
    # __getattr__ 只有在点调用属性且属性不存在的时候才会触发
    f1.anc # 打印:---->from getattr:你找的属性不存在
    f1['anc'] # 打印:---->from getitem:你找的属性不存在
  • 相关阅读:
    VB中Null、Empty、Nothing及vbNullString的区别
    hs_err_pidXXX.log 解读
    测试Windows Live Writer——开博
    BCPC2021预赛
    软件设计模式之策略模式(Strategy) 壹
    留言板 壹
    友链 壹
    正则表达式练习 壹
    SpringBoot+Mybatis+自定义注解+Atomikos+实现多源数据库切换和分布式事务
    Dependency failed for File System Check on /dev/vdb1 服务器配置升级
  • 原文地址:https://www.cnblogs.com/cong12586/p/11371935.html
Copyright © 2020-2023  润新知