相关疑难解决方法(0)

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

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

python oop

90
推荐指数
4
解决办法
10万
查看次数

__del__的用例

在python 3中编写自定义__del__方法或依赖stdlib 1中的一个用例是什么?也就是说,在什么情况下它是相当安全的,并且可以做一些没有它的事情很难做到的事情?

出于很多好的理由(1 2 3 4 5 6),通常的建议是避免__del__使用上下文管理器或手动执行清理:

  1. __del__如果对象在intrepreter出口2上处于活动状态,则不保证会被调用.
  2. 在点1期望对象可以被破坏时,引用计数实际上可以是非零的(例如,引用可以通过由调用函数保持的回溯帧而存活).这使得破坏时间远比仅仅gc暗示的不可预测性更不确定.
  3. 垃圾收集器如果包含多个对象,则无法摆脱循环 __del__
  4. 内部代码__del__必须仔细编写:
    • 设置的对象属性__init__可能不存在,因为__init__可能引发了异常;
    • 异常被忽略(仅打印到stderr);
    • 全局变量可能不再可用.

更新:

PEP 442在行为上做出了重大改进__del__.虽然我的第1-4点仍然有效?


更新2:

一些顶级的python库包含__del__在后PEP 442 python(即python 3.4+)中的使用.我想我的观点3在PEP 442之后不再有效,其他点被接受为对象终结的不可避免的复杂性.


1我将问题从编写自定义__del__方法扩展到包括依赖于__del__stdlib.

2似乎__del__总是在更新版本的Cpython中调用解释器退出(有没有人有反例?).然而,对于__del__可用性的目的并不重要:文档明确地不提供对此行为的保证,因此不能依赖它(它可能在将来的版本中发生变化,在非CPython解释器中可能会有所不同) .

python destructor python-3.x

14
推荐指数
2
解决办法
896
查看次数

标签 统计

python ×2

destructor ×1

oop ×1

python-3.x ×1