一、 引言

在前面几节我们介绍了__ 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


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

第8.31节 Python中使用__delattr__清除属性数据的更多相关文章

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

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

  2. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  3. 第7.15节 Python中classmethod定义的类方法详解

    第7.15节  Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一.    类方法的定义 在类中定 ...

  4. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  5. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  6. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...

  7. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  8. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  9. 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...

随机推荐

  1. 3、Django之路由层

    一 路由的作用 路由即请求地址与视图函数的映射关系,如果把网站比喻为一本书,那路由就好比是这本书的目录,在Django中路由默认配置在urls.py中. 二 简单的路由配置 # urls.py fro ...

  2. Python正则表达式-换行的匹配

    找到了之前参考的博文,用来记录一下https://www.cnblogs.com/baxianhua/p/8572805.html 平常 点 (.)去匹配任意字符的时候,是不能匹配换行符的 匹配换行: ...

  3. 【译】理解Rust中的闭包

    原文标题:Understanding Closures in Rust 原文链接:https://medium.com/swlh/understanding-closures-in-rust-21f2 ...

  4. HTML生成横向的PDF

    HTML生成PDF请参照:https://www.cnblogs.com/yunfeiyang-88/p/10984740.html 如要生成横向的PDF:在html模板的style标签里面加入@pa ...

  5. php执行exec、xsell_exec命令失败

    在php.ini下进行更改 查找disable_function 去掉exec xsell_exec 重启php

  6. 1. Spark的安装及介绍

    *以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第一部分是记录如何安装Spark?同时,简单介绍下Spark. 一.Spark安装 二.Spark介绍 一.Spark安装 如 ...

  7. read/write系统调用

    /*拷贝文件内容实例read系统调用.write系统调用ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, cons ...

  8. 用GitHub Pages搭建博客(六)

    本篇介绍GitHub Pages网站加速 在上一篇提到如何对GitHub Pages配置自定义域名.其实,不论GitHub Pages的默认域名还是自定义域名,都使用了GitHub的CDN进行加速,虽 ...

  9. 腾讯云容器服务 TKE 推出新一代零损耗容器网络

    随着容器技术的发展成熟,越来越多的组件迁移到容器,在技术迁移过程中,数据库,游戏,AI 这些组件对容器网络性能(时延,吞吐,稳定性)提出了更高的要求.为了得到更优的时延和吞吐表现,各大云厂商都在致力于 ...

  10. asp.net core 使用 TestServer 来做集成测试

    asp.net core 使用 TestServer 来做集成测试 Intro 之前我的项目里的集成测试是随机一个端口,每次都真实的启动一个 WebServer,之前也有看到过微软文档上 TestSe ...