- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
__del__
方法在引用计数达到零后多久被调用?该语言是否保证在任何其他使用代码可以执行之前立即完成?或者每个实现都可以做它喜欢的事情,可能会延迟对 __del__
任意长的调用?
请忽略程序即将退出的情况(我假设这意味着给定 block 中的最后一条语句已完成,并且堆栈为空)。我知道在这种情况下,没有关于 __del__
的 promise ;它甚至可能根本不会被调用。
此外,我知道由于周期等原因,引用计数可能不为零。我在这里并不担心(我正在问一个单独的问题)。
最佳答案
Python 不保证 __del__
何时被调用,或者它是否被调用。事实上,如果对象是引用循环的一部分,__del__
方法不太可能被调用,因为即使循环作为一个整体被清除,Python 也无法决定在哪里中断引用循环以及应该以什么顺序调用 __del__
方法(如果有)。由于 __del__
相当古怪的语义(为了调用 __del__
对象的引用计数暂时增加,并且 __del__
方法可以防止通过将引用存储在其他地方来破坏对象)在其他实现中发生的事情有点胡扯。 (我不记得当前 Jython 中的确切细节,但它在过去已经更改过几次。)
也就是说,在 CPython 中,if __del__
被调用,一旦引用计数降为零,它就会被调用(因为引用计数是唯一的方法 __del__
方法被调用,CPython 调用 __del__
的唯一机会是当实际的引用计数被更改时。)
关于python - 引用计数降为零后多久调用 `__del__`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796643/
我有一些 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
我是一名优秀的程序员,十分优秀!