当前位置: 首页 > 面试题库 >

Python-什么是__del__方法,如何调用?

皇甫敏达
2023-03-14
问题内容

我正在阅读代码。有一个__del__定义方法的类。我发现此方法用于销毁该类的实例。但是,我找不到使用此方法的地方。这样做的主要原因是我不知道如何使用此方法,可能不是这样的:obj1.del()。那么,我的问题是如何调用该__del__方法?


问题答案:

__del__是终结器。当对象被垃圾回收时调用该方法,该操作在删除该对象的所有引用之后的某个时间发生。

在一个简单的情况下,这可能是在你说完之后,del x或者如果x是局部变量,则在函数结束之后。特别是,除非有循环引用,否则CPython(标准Python实现)将立即进行垃圾回收。

但是,这是CPython 的实现细节。Python垃圾回收的唯一必需属性是,它在所有引用都被删除之后发生,因此这可能在此之后没有必要发生,也可能根本没有发生。

此外,由于多种原因,变量可以生存很长时间,例如,传播异常或模块自省可以使变量引用计数保持大于0。此外,变量可以是引用循环的一部分-启用垃圾回收的CPython多数会中断,但不是全部,这样的周期,甚至只是周期性的。

由于你不能保证它会被执行,因此永远不要将你需要运行的代码放入其中 __del__()-而是,该代码属于块的finally子句try或with语句中的上下文管理器。不过,也有有效的使用情况为__del__:例如,如果一个对象X的引用Y,也保留副本Y参考在全球cache(cache['X -> Y'] = Y),那么这将是对礼貌X.__del__也删除缓存条目。

如果你知道析构函数提供了必要的清除操作(违反了上述准则),则你可能希望直接调用它,因为该方法没有什么特别之处:x.__del__()。显然,只有在知道不介意被两次调用的情况下,才应该这样做。或者,作为最后的选择,你可以使用重新定义此方法

type(x).__del__ = my_safe_cleanup_method 


 类似资料:
  • 我们知道, Python 通过调用 __init__() 方法构造当前类的实例化对象,而本节要学的 __del__() 方法,功能正好和 __init__() 相反,其用来销毁实例化对象。 事实上在编写程序时,如果之前创建的类实例化对象后续不再使用,最好在适当位置手动将其销毁,释放其占用的内存空间(整个过程称为 垃圾回收(简称GC) )。 大多数情况下,Python 开发者不需要手动进行垃圾回收,

  • 本文向大家介绍python中的weekday()方法是什么?,包括了python中的weekday()方法是什么?的使用技巧和注意事项,需要的朋友参考一下 该方法用于返回一周中的特定日期。 示例 输出结果

  • 本文向大家介绍什么是python中的prmonth()方法?,包括了什么是python中的prmonth()方法?的使用技巧和注意事项,需要的朋友参考一下 Python有一个名为Calendar的内置模块,该模块包含支持各种日历操作的类和函数,默认情况下,Calendar模块遵循公历。  prmonth()方法是TextCalendar实例的方法之一。用于打印由返回的月份的日历。  语法:prmo

  • 问题内容: 我想计算一个可迭代对象满足给定条件的数量。我想以一种清晰,简单,最好是合理的方式进行操作。 我目前最好的想法是: 和 第一个是基于迭代器的,对于大列表来说可能更快。它与您用于测试任何和所有测试的表单相同。但是,这取决于int(True)== 1,这有点难看。 第二个对我来说似乎更容易阅读,但是它与任何和所有形式都不同。 有没有人有更好的建议?我缺少某处的库函数吗? 问题答案: 基于迭代

  • 问题内容: 我已经在某些计算机科学测试中看到了下一段,希望我能在这里对它的含义有一个很好的解释,因为我用它搜索了一个小时,却找不到任何东西。 “当我们说Java语言具有 虚拟方法调用时 ,是指在Java应用程序中,执行的方法由运行时的对象类型决定” 这是什么意思?谁能更好地解释它? 问题答案: 这些行的作者使用的C ++术语。 更好的术语是动态绑定/动态调度。 这意味着,对象的动态类型是“选择”将