- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我了解到 python does not guarantee每当删除一个对象时调用 __del__
。换句话说,del x
不一定调用它的析构函数x.__del__()
。
如果我想确保正确的对象清理,我应该使用 context manager (在 with
语句中)。
我知道这很愚蠢,但出于几个原因(请不要问为什么)我被绑定(bind)到一个使用 Python 2.4 的系统;因此上下文管理器是毫无疑问的(它们是在 Python 2.5 中引入的)
所以我需要一个替代解决方案,因此我的问题是:是否有最佳实践可以帮助我可靠地使用 __del__
?我的想法是 “如果 python 提供了这样的功能,则必须有一种方法可以有效地使用它(我只是愚蠢地弄清楚如何使用)”,,,
或者我只是太天真了,应该忘记 __del__
并转向完全不同的方法?
最佳答案
简而言之:不,没有办法确保它被调用。
答案是自己实现上下文管理器。 with
语句大致翻译为:
x.__enter__()
try:
...
finally:
x.__exit__()
所以只能手动操作。它比那复杂一点,所以我建议阅读 PEP 343以充分了解上下文管理器的工作原理。
一个选择是调用你的清理函数close()
,然后在未来的python版本中,人们可以很容易地使用contextlib.closing
。将其变成真正的上下文管理器。
关于python - 如何以可靠的方式使用 __del__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10352480/
我有一些 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
我是一名优秀的程序员,十分优秀!