第8.31节 Python中使用__delattr__清除属性数据
2024-09-01 10:45:35
一、 引言
在前面几节我们介绍了__ getattribute__方法和__setattr__方法,分别实现了实例属性的查询和修改(含定义即新增),作为Python中数据操作必不可少的三剑客get、set、delete,get、set都有操作捕获方法,delete一样有对应操作的捕获方法,这个方法就是内置方法__delattr__。
二、 语法释义
- 语法:实例. delattr(属性名)
- 直接调用该函数可以删除对应实例的对应实例变量,不能删除类体中定义的方法和类变量,否则会报AttributeError;
- 该函数无返回值,如果出现异常,直接呈现对应异常.
三、 案例
- 案例说明
案例中定义了类Car,类中有构造方法和drive方法,有2个实例变量power、totaldistance,用该类定义实例对象car,对相关属性执行__delattr__方法,看执行结果。 - 案例代码及输出(交互模式执行)
>>> 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)直接用属性名无法执行__delattr__成功,必须用字符串;
2)实例方法无法执行__delattr__;
3)执行成功__delattr__后,字典中对应属性被删除,与直接“del 实例.属性”效果相同。
由于Python中采用自动引用计数(ARC:Automatic Reference Counting)方式来判断对象是否需要被回收,因此对应实例属性是否能删除需要Python内部的机制来保障,因此老猿不建议大家直接调用__delattr__方法来删除实例的属性,不过在特定情况下可以通过重写该方法进行一些属性删除的特殊处理,确保相关实例属性释放时程序进行了正确处理。
本节简单介绍了__delattr__方法调用的语法,不过老猿不建议大家直接调用该方法,而是在特定情况下重写该方法。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
最新文章
- Elasticsearch集群状态脚本及grafana监控面板导出的json文件
- Android中数据的传递以及对象序列化
- jQ获取浏览器window的高宽
- svn提交时强制添加注释
- Python学习第四天集合
- H3C ipsec ike 协商配置
- sublime 插件zen coding
- Singelton单例模式
- .net和MVC中的json值和List<;T>;和DataTable的一些转换
- js 打开新页面 window.open()
- 九度OnlineJudge之1012:畅通工程
- Oracle笔记(六) 多表查询
- Sublime Text3 使用手册
- SqlBulkCopy效率低下原因分析
- centos7下安装apache服务器httpd的yum方式安装
- js坚持不懈之16:使用js向HTML元素分配事件
- linux指定只显示(只打印)文件中的某几行(中间几行)
- linux 学习笔记 查看端口
- 线程间的通信_多生产者多消费者问题_JDK1.5新特性_Lock
- 宝宝刷 leetcode
热门文章
- [MIT6.006] 20. Daynamic Programming II: Text Justification, Blackjack 动态规划II:文本对齐,黑杰克
- 这些表情包你有吗?来 Battle 啊
- 希捷powerchoice磁盘休眠功能arm打包
- 测试_QTP使用实例
- c++11-17 模板核心知识(八)—— enable_if<;>;与SFINAE
- [head first 设计模式]第二章 观察者模式
- jdk的切换
- 使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。
- 如何在PDF文档上加水印
- FL studio系列教程(九):FL Studio中如何排列编曲