• 自定义属性访问


    __getattr__属性

    什么时候触发:

    当我们访问属性的时候,如果属性不存在,则触发此方法;

    class MyTest:
        def __getattr__(self, item):
            #   当访问的属性不存在时,该方法会被触发
            print("触发__getattr__属性")
            super().__getattribute__(item)
    
    mt = MyTest()
    mt.name
    
    执行结果:
        mt.name
      File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 32, in __getattr__
        super().__getattribute__(item)
    AttributeError: 'MyTest' object has no attribute 'name'
    触发__getattr__属性

    官方文档给出:该方法应当返回一个属性值,或者引发一个异常;

    __getattribute__属性

    什么时候触发:

    查找属性的时候,第一时间触发该方法去查找属性;

    class MyTest:
        def __getattr__(self, item):
            #   当访问的属性不存在时(报AttrError异常时),该方法会被触发
            print("触发__getattr__方法")
            super().__getattribute__(item)
    
        def __getattribute__(self, item):
            #   当访问属性的时候,第一时间触发此方法去查找属性
            print("触发__getattribute__方法")
            return object.__getattribute__(self,item)
    
    
    
    mt = MyTest()
    mt.name
    
    执行结果:
    触发__getattribute__方法
    Traceback (most recent call last):
    触发__getattr__方法
      File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 43, in <module>
        mt.name
      File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 33, in __getattr__
        super().__getattribute__(item)
    AttributeError: 'MyTest' object has no attribute 'name'

    通过上面的例子,我们可以看到,当访问属性的时候,首先触发的是__getattribute__方法,由于访问的属性name不存在,于是触发__getattr__方法

    __setattr__属性

    什么时候触发:

    当设置属性的时候触发;

    class MyTest:
    
        def __setattr__(self, key, value):
            #   这个方法是在给对象设置属性的时候触发
            print("触发__setattr__方法")
            super().__setattr__(key,value)  #  key是属性名,value是属性值
    
    mt = MyTest()
    mt.name = 10
    print(mt.name)
    
    执行结果:
    触发__setattr__方法
    10

    可以通过自定义此方法,在设置属性之前做操作

    __delattr__属性

    class MyTest:
        
        def __delattr__(self, item):
            # 这个方法在删除属性的时候触发
            print("触发__delattr__方法")
            super().__delattr__(item)  #   item是属性名
    
    mt = MyTest()
    mt.name = 10
    del mt.name  #  删除属性
    print(mt.name)
    
    执行结果:
    触发__delattr__方法
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 55, in <module>
        print(mt.name)
    AttributeError: 'MyTest' object has no attribute 'name'

    通过上面的例子,我们可以发现,当删除属性的时候,触发__delattr__方法,我们可以通过定义此方法,在删除属性之前做操作;

    ****总结:

    上面的四个方法都要调用父类的相应方法,是因为,重新定义属性方法后,没有各自对应的能力了,只有调用相应的父类的方法才能到达要求;

  • 相关阅读:
    对流程和规范的思考
    我的一小时面试指南
    安全扫描工具nikto简单使用
    测试的角色
    测试的窘境
    关于重连测试的一点研究
    ETCD高可用特性学习
    Cgroup和Namespace在测试中的使用(下)
    单循环列表的删除前驱结点
    指针常量字符串
  • 原文地址:https://www.cnblogs.com/lzh501/p/10920711.html
Copyright © 2020-2023  润新知