python - 为什么不调用 __del__ 方法?
问题描述
这是object.__del__(self)
文档中的内容:
当实例即将被销毁时调用
这是del
文档中的内容:
删除名称会从本地或全局命名空间中删除该名称的绑定,具体取决于该名称是否出现在同一代码块中的全局语句中
我还在这里阅读了许多关于 SO 的相关问题。我知道如果有多个变量指向同一个对象,那么当然删除一个名称不会触发对象__del__
方法(因为仍然有一个变量引用该对象)。
所以我尝试了一些实验来检查我是否正确理解了所有内容。假设我有这个课程:
class A:
def __del__(self):
print('Object finalizer')
现在,这就是我所做的:
>>> a1 = A()
>>> del a1
Object finalizer
到目前为止,一切都按预期工作:只有一个对该对象的引用,所以一旦我删除该引用,该对象也会被删除。然后,我尝试使用两个名称引用同一个对象:
>>> a1 = A()
>>> a2 = a1
检查这两个变量是否实际上引用了同一个对象:
>>> a1
<__main__.A object at 0x7fef201f4fd0>
>>> a2
<__main__.A object at 0x7fef201f4fd0>
但是,如果我现在尝试删除所有引用,事情不会按预期进行:
>>> del a1
>>> del a2
>>>
我期待__del__
在声明之后调用该方法del a2
。为什么会这样?我错过了什么?
解决方案
推荐阅读
- html - 单个 CSS 样式表中的多个样式标题而不更改 HTML
- node.js - 如何使 VS Code 可重现地调试 Electron App?
- java - 如何优化应该读取给定输入的最后 5000 行的 java 代码的速度/内存
- node.js - puppeteer 滚动直到特定按钮或 div
- scala - 在 Scala 中,“T 中的协变”和“T 中的逆变”到底是什么意思?
- java - 使用 MongoDB Java 仅检索数组子文档字段的值
- c - 如何更改 C 中句柄的值?
- sql-server - 安装扩展时在我的 Visual Studio 2019 上找不到“集成服务”
- javascript - 检查是否所有值都 $ 在 Mongoose 的数组中
- r - 从R中的数据框中随机选择一个不是NA的行