- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
__del__
的 Python 文档说明当对象的引用计数减少到零时,可以调用对象的 __del__
方法。它总是立即调用(即同步)吗?或者 __del__
方法是否有可能“在未来的某个时候”被调用?
此外,这个问题的答案一般适用于 Python 吗?还是授予语言实现一定的自由度? (我使用 CPython。)
对于这个问题,假设如下:
object
。__del__
实现。__del__
实现不会创建对任何对象的新引用。据我所知,围绕这个主题似乎存在很多困惑。为了回避一些不必要的讨论,让我举一些 Not Acceptable 答案的例子:
__del__
!这很困惑!”__del__
!它不是‘pythonic’。”__del__
,而是使用上下文管理器。”要用示例重新表述这个问题,请考虑以下代码:
class C(object):
def __init__(self, i):
self.i = i
def __del__(self):
print "C.__del__:", self.i
print "Creating list"
l = [C(0), C(1), C(2)]
print "Popping item 1"
l.pop(1)
print "Clearing list"
l = []
print "Exiting..."
产生以下输出:
$ python test_del.py
Creating list
Popping item 1
C.__del__: 1
Clearing list
C.__del__: 2
C.__del__: 0
Exiting...
请注意,在此示例中,__del__
被同步调用。这种行为是由语言保证的吗? (请记住上面列出的假设。)
最佳答案
来自 Python 语言引用(Python 2.7.3 版),Chapter 3, Data model :
Objects are never explicitly destroyed; however, when they become unreachable they may be garbage-collected. An implementation is allowed to postpone garbage collection or omit it altogether — it is a matter of implementation quality how garbage collection is implemented, as long as no objects are collected that are still reachable.
CPython implementation detail: CPython currently uses a reference-counting scheme with (optional) delayed detection of cyclically linked garbage, which collects most objects as soon as they become unreachable, but is not guaranteed to collect garbage containing circular references. See the documentation of the
gc
module for information on controlling the collection of cyclic garbage. Other implementations act differently and CPython may change. Do not depend on immediate finalization of objects when they become unreachable (ex: always close files).
关于python - python 总是同步调用 __del__ 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690135/
我有一些 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
我是一名优秀的程序员,十分优秀!