我的Python类定义了__del__方法,但是当我删除对象时它并没有被调用


prtyaa
prtyaa 2024-01-08 22:13:50 62881 赞同 0 反对 0
分类: 资源 标签: 运维
__del__ 是 Python 中的魔术方法。这些神奇的方法使我们能够在面向对象编程中实现一些非常巧妙的技巧。它们也称为 Dunder 方法。这些方法由两个下划线 (__) 用作前缀和后缀来标识。 在Python中,我们使用__new__()创建一个对象并使用__init__()进行初始化。然而,要破坏一个对象,我们有 __del__()。

示例

让我们创建和删除一个对象 –

class Demo:
def __init__(self):
print(“We are creating an object.”);
# destructor
def __del__(self):
print(“We are deleting an object.”);

# Createing and deleting an object
ob = Demo();
del ob;

登录后复制

输出

We are creating an object.
We are deleting an object.

登录后复制

原因

但是,如果一个类定义了 __del__ 但在删除对象时没有调用,原因可能有很多 –

  • del 语句不一定调用 __del__() – 它只是减少对象的引用计数,如果达到零,则调用 __del__()。

  • __del__() 方法可以随机调用。 – 如果您的数据结构包含循环链接,则引用计数将永远不会回到零。 Python 运行一种算法来检测此类循环,但垃圾收集器可能会在对数据结构的最后一个引用消失后的某个时间运行。

解决问题

以下是修复 –

  • 不要直接调用 __del__() – _del__() 应调用 close(),并且 close() 应确保可以对同一对象多次调用它。

  • 避免循环引用 – 使用weakref模块来避免循环引用。它允许您指向对象而不增加其引用计数。 Weakref 模块还可以用于获取类的实例

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL0
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD  81
以openkylin为例编译安装内核  77
分享解决宏碁电脑关机时自动重启的方法  73
统信uosboot区分未挂载导致更新备份失败  63
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作  63
统信uos安装mysql的实例参考  60
格之格打印机dp3300系列国产系统uos打印机驱动选择  57
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。  51
MySQL国产平替最佳选择---万里数据库(GreatDB)  45
分享在麒麟系统中权限异常的解决方法  1
最近下载排行榜
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD 0
以openkylin为例编译安装内核 0
分享解决宏碁电脑关机时自动重启的方法 0
统信uosboot区分未挂载导致更新备份失败 0
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作 0
统信uos安装mysql的实例参考 0
格之格打印机dp3300系列国产系统uos打印机驱动选择 0
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。 0
MySQL国产平替最佳选择---万里数据库(GreatDB) 0
分享在麒麟系统中权限异常的解决方法 0
作者收入月榜
1

prtyaa 收益400.83元

2

zlj141319 收益237.91元

3

哆啦漫漫喵 收益231.52元

4

IT-feng 收益219.92元

5

1843880570 收益214.2元

6

风晓 收益208.24元

7

777 收益173.17元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!