第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 ...
随机推荐
- VSCode--HTML代码片段(基础版,react、vue、jquery)
起因是最近在学习前端,看的网上的demo也是在react.vue.jquery之间穿插,为了方便一键生成html模板(懒)写demo,有了以下折腾. 本人使用的前端编辑工具是vscode(方便.懒), ...
- ubuntu 18.04 安装anaconda
ubuntu 安装anaconda 4版本 为了学习 tensorflow python3.5 版本 使用anaconda 安装: https://mirrors.tuna.tsinghua.edu. ...
- 随笔1.流程控制--if
# 流程控制--if `-*- coding:utf-8 -*- #定义字符编码`## 1.判断条件if```python age = input("输入年龄:") #将交互式输入 ...
- C#泛型用法,附代码示列
C#中的泛型,大致有如下几种:泛型方法,泛型类,泛型接口,泛型委托,泛型约束等 使用泛型的好处一个是为了减少代码量,更主要的是能提高效率,不需要进行拆箱和装箱的操作. 下面是写的简单的例子,共勉,加深 ...
- react 中组件状态的一些理解
组件状态:即 state 只有当state发生变化时,组件才会更新. 当一个html标签的值依赖于state的值得时候,如果state的值没有更新时,这个标签的值无论如何也是不会更新的. 看下面示例: ...
- Vs编译时RazorTagHelper - DOTNET_HOST_PATH is not set
今天听朋友说遇到一个问题,打开一个aspnetcore2.2的项目工程,发现挺有意思,缺少环境变量DOTNET_HOST_PATH 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB401 ...
- InnoDB事务的二阶段提交
问题: 什么是二阶段提交 为什么需要二阶段提交 二阶段提交流程 什么是二阶段提交? ### 假设原来id 为10 的记录age 为5 begin; update student set age = 1 ...
- 【鸿蒙应用开发】使用确切位置布局(PositionLayout)实现登录页面
上一节我们了解了PositionLayout(确切位置布局,我更倾向于称为绝对布局),虽然应用场景稀少.维护不方便,但是该有的示例还是不能少. UI图拆解及代码实现 这个界面我们是不是很熟悉,打开浏览 ...
- Go原生和GoFrame的Cookie关于MaxAge区别
Go原生和GoFrame的Cookie关于MaxAge区别 环境: gf v1.14.4 go 1.11 Go原生 type Cookie struct { Name string Value str ...
- 面试半年,凭借这份JVM面试题,我终于拿到了字节跳动的offer!
内存区域 虚拟机栈生命周期与线程相同,描述的是Java 方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存取局部变量表.操作数栈.动态链接.方法出口等信息本地方法栈与虚拟机栈作用相似,只 ...