第8.32节 Python中重写__delattr__方法捕获属性删除
一、 引言
上节介绍了__delattr__方法在Python清除实例属性时被捕获执行,本节结合例子介绍重写__delattr__方法,并说明__delattr__方法执行的触发逻辑。
二、 重写__delattr__方法
- 重写语法:
__delattr__(self,属性)
- 语法释义
__delattr__
语法很简单:
1)self是所有实例方法都必须有的第一个参数,大家如果有疑问可以参考老猿前面的博文《第7.5节 揭开Python类中self的面纱》;
2)属性与前面__ getattribute__
方法和__setattr__
方法一样,是字符串,字符串内是属性的名字;
3)重写该方法时,如果除了开发人员自己添加的逻辑,如果要实现真正的属性删除,必须调用父类的__delattr__
方法,否则相关属性不会清除。
三、 案例
- 案例说明
案例中定义了类Car,类中有构造方法、__delattr__
方法,有2个实例变量power、totaldistance,用该类定义实例对象car,对相关属性执行del操作,看执行结果。 - 案例代码及输出(交互模式执行)
>>> 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)删除实例变量包括特殊变量都会触发__delattr__方法执行;
2)删除__dict__并没有真正删除该变量,这应该是object类的__delattr__方法进行了特殊处理,重写的__delattr__方法也可以进行类似这种特殊处理。
本节介绍了重写__delattr__方法的相关内容,建议大家只有在应用有特殊逻辑需要处理时才重写该方法,如将容器删除编程容器元素清零处理。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
第8.32节 Python中重写__delattr__方法捕获属性删除的更多相关文章
- 第8.31节 Python中使用__delattr__清除属性数据
一. 引言 在前面几节我们介绍了__ getattribute__方法和__setattr__方法,分别实现了实例属性的查询和修改(含定义即新增),作为Python中数据操作必不可少的三剑客get.s ...
- 第8.20节 Python中限制动态定义实例属性的白名单:__slots__
一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...
- 第8.33节 Python中__getattr__以及__getattr__与__ getattribute__的关系深入剖析
一. 引言 前面几节分别介绍了Python中属性操作捕获的三剑客:__ getattribute__方法.__setattr__方法.__delattr__方法,为什么__ getattribute_ ...
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
- 第7.15节 Python中classmethod定义的类方法详解
第7.15节 Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一. 类方法的定义 在类中定 ...
- 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- 第7.22节 Python中使用super调用父类的方法
第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
随机推荐
- 安装node.js和vue
1.在官网上下载Node.js安装包 https://nodejs.org/zh-cn/ 2.点击安装,一直下一步下一步就行,这里就不在赘述了. 3.安装完之后,如果没有选安装路径的话,一般都是在[ ...
- php执行exec、xsell_exec命令失败
在php.ini下进行更改 查找disable_function 去掉exec xsell_exec 重启php
- linux文本模式和文本替换功能
linux文本有:正常模式,编辑模式,可视化模式,命令模式. 正常模式进入编辑模式下的快捷键: i --光标当前位置输入 a --光标位置后输入(append) I --行首输入 A --行尾输入 ...
- deepin 安装最新版node
安装npm sudo apt install npm 安装node sudo npm install -g n 升级node到稳定版 sudo n stable 升级到最新版 sudo n lates ...
- Java 微信端评论表情处理
1,工具包下载:https://github.com/vdurmont/emoji-java 2,文本保存时处理:EmojiParser.parseToHtmlHexadecimal(str) 3,文 ...
- 保证看完就会!大数据YRAN核心知识点来袭!
01 我们一起学大数据 大家好,今天分享的是大数据YRAN的核心知识点,老刘尽量用通俗易懂的话来讲述YARN知识点,争取做到大家看完后能够用口语化的形式将它们表达出来,做到真正的看完就会!(如果觉得老 ...
- Hadoop大数据平台之Zookeeper搭建
环境:CentOS 7.4 (1708 DVD) 工具:MobaXterm 1. 使用xftp将hadoop上传到/usr/local目录下,将其解压并重命名. 2. 修改环境变量并source. ...
- 打开WPS时出现MathType错误弹窗怎么办
MathType是一款特别优秀的公式编辑器,特别是在文档中出现大量的复杂数学公式需要编辑时.不过MathType与Office的兼容性还算好,与WPS的兼容性要略逊一筹,有时候会出现如下的报错弹窗.提 ...
- 二分查找 leetcode704
class Solution { public int search(int[] nums, int target) { int l=0; int r=nums.le ...
- leetcode 493
//利用归并排序来完成,归并排序可参考前面代码,归并排序可用来完成这类逆序对之类的问题,采用分治的思想,对于归并排序的代码不需要多改动,只需要在归并之前进行一次寻找操作,找出count的数量 clas ...