第8.32节 Python中重写__delattr__方法捕获属性删除

一、 引言
上节介绍了__delattr__方法在Python清除实例属性时被捕获执行,本节结合例子介绍重写__delattr__方法,并说明__delattr__方法执行的触发逻辑。
二、 重写__delattr__方法

  1. 重写语法:
__delattr__(self,属性)
  1. 语法释义
    __delattr__语法很简单:
    1)self是所有实例方法都必须有的第一个参数,大家如果有疑问可以参考老猿前面的博文《第7.5节 揭开Python类中self的面纱》;
    2)属性与前面__ getattribute__方法和__setattr__方法一样,是字符串,字符串内是属性的名字;
    3)重写该方法时,如果除了开发人员自己添加的逻辑,如果要实现真正的属性删除,必须调用父类的__delattr__方法,否则相关属性不会清除。

三、 案例

  1. 案例说明
    案例中定义了类Car,类中有构造方法、__delattr__方法,有2个实例变量power、totaldistance,用该类定义实例对象car,对相关属性执行del操作,看执行结果。
  2. 案例代码及输出(交互模式执行)
>>> class Car():
    refcount = 0
    def __init__(self, power):
        self.power = power
        self.totaldistance=0
        
    def __delattr__(self,name):
        print(f"execute __delattr__:name={name}")
        super().__delattr__(name)
 
>>> car = Car('汽油发动机')
>>> car.__dict__  #查看自定义实例变量
{'power': '汽油发动机', 'totaldistance': 0}
>>> del car.power  #触发了__delattr__的执行
execute __delattr__:name=power
>>> car.__dict__ #查看实例变量,power已经删除了
{'totaldistance': 0}
>>> del car.__dict__  #删除__dict__,触发了__delattr__的执行
execute __delattr__:name=__dict__
>>> car.__dict__ #查看实例变量,字典清空了,并不是__dic__删除了
{}
>>>
  1. 案例截屏
    第8.32节 Python中重写__delattr__方法捕获属性删除_第1张图片
  2. 案例小结
    通过以上案例可以看到:
    1)删除实例变量包括特殊变量都会触发__delattr__方法执行;
    2)删除__dict__并没有真正删除该变量,这应该是object类的__delattr__方法进行了特殊处理,重写的__delattr__方法也可以进行类似这种特殊处理。

本节介绍了重写__delattr__方法的相关内容,建议大家只有在应用有特殊逻辑需要处理时才重写该方法,如将容器删除编程容器元素清零处理。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!

你可能感兴趣的:(老猿Python)