zoukankan      html  css  js  c++  java
  • 第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. 案例截屏
      在这里插入图片描述
    2. 案例小结
      通过以上案例可以看到:
      1)删除实例变量包括特殊变量都会触发__delattr__方法执行;
      2)删除__dict__并没有真正删除该变量,这应该是object类的__delattr__方法进行了特殊处理,重写的__delattr__方法也可以进行类似这种特殊处理。

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

    请大家多多支持,点赞、评论和加关注!谢谢!

  • 相关阅读:
    电容
    51单片机
    三极管
    Scala 面向对象(八):特质(接口) 一
    Scala 面向对象(七):静态属性和静态方法
    Scala 面向对象(六):面向对象的特征二:继承 (一)
    Scala 面向对象(五):面向对象的特征一:封装性
    Scala 面向对象(四):import
    Scala 面向对象(三):package 包 (二)
    Scala 面向对象(二):package 包 (一) 入门
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643701.html
Copyright © 2011-2022 走看看