- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Python 3 中编写自定义 __del__
方法或依赖 stdlib1 方法的用例有哪些?也就是说,在什么情况下它是相当安全的,并且可以做一些没有它很难做的事情?
出于许多充分的理由 ( 1 2 3 4 5 6 ),通常的建议是避免 __del__
而是使用上下文管理器或手动执行清理:
__del__
如果对象在解释器导出 2 上还活着,则不能保证被调用。gc
所暗示的不可预测性要不确定得多。__del__
的对象,则垃圾收集器无法摆脱循环__del__
中的代码必须写得 super 仔细:
__init__
中设置的对象属性可能不存在,因为 __init__
可能引发异常;stderr
);更新:
PEP 442 对 __del__
的行为进行了重大改进。看来我的第 1-4 点仍然有效?
更新 2:
后 PEP 442 python(即 python 3.4+)中的一些顶级 python 库 embrace the use of __del__
。我想我的第 3 点在 PEP 442 之后不再有效,其他点被认为是对象终结不可避免的复杂性。
1我将问题从仅编写自定义 __del__
方法扩展为包括依赖 stdlib 中的 __del__
。
2似乎 __del__
在较新版本的 Cpython 中总是在解释器退出时被调用(有人有反例吗?)。然而,为了 __del__
的可用性目的并不重要:文档明确 provide no guarantee about this behavior ,所以不能依赖它(它可能在未来的版本中改变,并且在非CPython 解释器)。
最佳答案
上下文管理器(和 try
/finally
block )在某种程度上比 __del__
更具限制性。通常,它们要求您以这样一种方式构建代码,即您需要释放的资源的生命周期不会超出调用堆栈中某个级别的单个函数调用,而不是将其绑定(bind)到生命周期可能在不可预知的时间和地点被销毁的类实例。将资源的生命周期限制在一个范围内通常是一件好事,但有时在某些极端情况下,这种模式不适合使用。
我使用 __del__
的唯一情况(除了调试,c.f. @MSeifert 的回答)是为了释放由外部库在 Python 外部分配的内存。由于我包装的库的设计,很难避免有大量对象保存指向堆分配内存的指针。使用 __del__
方法释放指针是最简单的清理方法,因为将每个实例的生命周期包含在上下文管理器中是不切实际的。
关于python - __del__ 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43666794/
我有一些 test.py 文件: class A: def __init__(self): print("A init") def __del__(self):
这个问题在这里已经有了答案: What is the __del__ method and how do I call it? (5 个答案) 关闭 3 年前。 经过多次检查,我确实发现了关于该主题
在使用 multiprocessing 时,我注意到在下面的脚本中,__del__ 被调用了两次(一次在子进程中,一次在父进程中)。 class myclass(object): def __
我正试图将一个写得不好的 Python 模块(我无法控制)包装在一个类中。问题是,如果我没有明确调用该模块的 close 函数,那么 python 进程会在退出时挂起,因此我试图用一个具有 del 方
我正在尝试使用静态列表创建一个类,它收集一个对象类的所有新实例。我面临的问题似乎是,一旦我尝试以与整数相同的方式使用列表,我就不能再使用魔法标记 __del__。 我的例子: class MyClas
我使用 __del__() 编写警告日志,以防对象在错误的内部状态下被删除(请不要为此生气)。 我尝试对其进行测试,但尽管我在测试中使用了 del my_object,但似乎并未调用 __del__(
今天早些时候我问了this关于使用导入模块的对象的 __del__() 方法的问题。问题是 __del__() 想要使用模块 os,但有时(并非总是)该模块已被删除。有人告诉我,当 Python 程序
__del__ 方法在引用计数达到零后多久被调用?该语言是否保证在任何其他使用代码可以执行之前立即完成?或者每个实现都可以做它喜欢的事情,可能会延迟对 __del__ 任意长的调用? 请忽略程序即将退
我了解到 python does not guarantee每当删除一个对象时调用 __del__。换句话说,del x不一定调用它的析构函数x.__del__()。 如果我想确保正确的对象清理,我应
假设有一个程序在运行时有几个对象存在于其中。 程序结束时是否调用了每个对象的__del__方法? 如果是,我可以做这样的事情: class Client: __del__( self ):
我读了an example in David Beazley's Python Essential Reference : class Account(object): def __init_
我主要用 C++ 做事,其中析构函数方法实际上是为了销毁已获取的资源。最近我开始使用 python(这真的很有趣而且很棒),我开始学习它像 java 一样具有 GC。因此,没有过分强调对象所有权(构造
Python 3 中编写自定义 __del__ 方法或依赖 stdlib1 方法的用例有哪些?也就是说,在什么情况下它是相当安全的,并且可以做一些没有它很难做的事情? 出于许多充分的理由 ( 1 2
monkeypatch是 pytest 中的一个很棒的工具,允许您替换当前测试范围内的任何函数。最棒的事情之一是甚至可以修补构造函数。然而不幸的是,我在修补析构函数时遇到了麻烦。它似乎只有在测试成功时
我正在使用单例对象来管理数据库连接。我正在运行一系列依赖于该对象的测试。另外,我也必须测试该对象,因此我必须删除它并检查它的 __del__ 方法是否正确执行。 当我测试它时,因为我删除了单例,所以其
我为日志记录模块编写了一个包装类,它具有 __del__ 方法来在程序末尾删除日志文件。 我的程序将此日志文件从其他类复制到存档中,并且在下一个程序执行之前工作文件夹中没有日志文件很重要。但我无法从其
我正在编写一个 Lua 包装器,最高级别的抽象在其 __del__ 方法中调用 lua_close 。据我所知,除了 setuptools 测试之外,每个测试都通过了(即常规单元测试有效,而使用 se
这个问题已经有答案了: What is the __del__ method and how do I call it? (5 个回答) 已关闭 6 年前。 我想在字典中注册我的类上的每个实例,键是参
这个虚拟类与我当前的项目类似: class EndProcess(object): def __init__(self): self._Q = multiprocessing.
是否有一种简单的方法可以打印 __del__ 中发生的异常的堆栈跟踪?就我而言,没有为此对象定义 __del__ 方法 Exception TypeError: "'NoneType' object
我是一名优秀的程序员,十分优秀!