• 第8.31节 Python中使用__delattr__清除属性数据


    一、 引言
    在前面几节我们介绍了__ getattribute__方法和__setattr__方法,分别实现了实例属性的查询和修改(含定义即新增),作为Python中数据操作必不可少的三剑客get、set、delete,get、set都有操作捕获方法,delete一样有对应操作的捕获方法,这个方法就是内置方法__delattr__。

    二、 语法释义

    1. 语法:实例. delattr(属性名)
    2. 直接调用该函数可以删除对应实例的对应实例变量,不能删除类体中定义的方法和类变量,否则会报AttributeError;
    3. 该函数无返回值,如果出现异常,直接呈现对应异常.

    三、 案例

    1. 案例说明
      案例中定义了类Car,类中有构造方法和drive方法,有2个实例变量power、totaldistance,用该类定义实例对象car,对相关属性执行__delattr__方法,看执行结果。
    2. 案例代码及输出(交互模式执行)
    >>> class Car():
        refcount = 0
        def __init__(self, power):
            self.power = power
            self.totaldistance=0
            
        def drive(self,distance):
            print(f"In method drive:distance={distance}")
            self.totaldistance+=distance
           
    >>> car = Car('汽油发动机')
    >>> car.__dict__  #查看自定义实例变量
    {'power': '汽油发动机', 'totaldistance': 0}
    >>> car.__delattr__(power)#应该报错,属性名应该是字符串类型
    Traceback (most recent call last):
      File "<pyshell#74>", line 1, in <module>
        car.__delattr__(power)#应该报错,属性名应该是字符串类型
    AttributeError: 汽油发动机
    >>> car.__delattr__('power')
    >>> car.__delattr__('drive') #应该报错,方法不能删除
    Traceback (most recent call last):
      File "<pyshell#76>", line 1, in <module>
        car.__delattr__('drive') #应该报错,方法不能删除
    AttributeError: drive
    >>> car.__dict__  #查看实例变量,power已经删除了
    {'totaldistance': 0}
    >>> 
    >>>
    
    1. 案例截屏
      在这里插入图片描述
    2. 案例小结
      通过以上案例可以看到:
      1)直接用属性名无法执行__delattr__成功,必须用字符串;
      2)实例方法无法执行__delattr__;
      3)执行成功__delattr__后,字典中对应属性被删除,与直接“del 实例.属性”效果相同。

    由于Python中采用自动引用计数(ARC:Automatic Reference Counting)方式来判断对象是否需要被回收,因此对应实例属性是否能删除需要Python内部的机制来保障,因此老猿不建议大家直接调用__delattr__方法来删除实例的属性,不过在特定情况下可以通过重写该方法进行一些属性删除的特殊处理,确保相关实例属性释放时程序进行了正确处理。

    本节简单介绍了__delattr__方法调用的语法,不过老猿不建议大家直接调用该方法,而是在特定情况下重写该方法。

    老猿Python,跟老猿学Python!
    博客地址:https://blog.csdn.net/LaoYuanPython

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

  • 相关阅读:
    mysql 数据库集群连接配置
    tomcat server.xml 配置优化
    使用PowerDesigner16.5 逆向数据库生产表结构或导出word文档
    SpringBoot、thymeleaf 国际化配置
    解决 SpringBoot 跨域请求问题
    在 centos7 系统中用 docker 创建 tomcat 服务镜像
    JAVA 调用 com.google.protobuf
    登录后获取token,作为参数传入下一个操作
    通过二进制数据流方式上传图片及性能测试脚本编写
    信息服务(ISS)管理器之报错【"/"应用程序中的服务器错误。】
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643710.html
Copyright © 2020-2023  润新知