python - Python 中的析构函数
问题描述
下面是代码。我没有手动del
对象引用,但在 VScode 中也__del__
被调用。但是同一段代码正在 Jupyter Notebook 中运行。这意味着,__del__
不会自动调用。代码有问题吗?使困惑。VScode 是否(自动)处理垃圾收集器?谷歌了很多,但没有得到适当的答案。
class Student:
# constructor
def __init__(self, name):
print('Inside Constructor')
self.name = name
print('Object initialized')
def show(self):
print('Hello, my name is', self.name)
# destructor
def __del__(self):
print('Inside destructor')
print('Object destroyed')
# create object
s1 = Student('Emma')
s2 = s1;
s3 = s1;
print("Id of S1: " , id(s1));
解决方案
最好调用__del__
终结器方法,因为该方法会在对象即将被垃圾回收时被调用。(比如当所有对该对象的引用都消失了。)
在 VSCode 中,甚至当您在终端中运行脚本时,当解释器到达文件末尾时,它将终止执行和进程,因此任何对象都将被销毁。所以你可以看到这个方法被调用了。所以即使你没有del
明确地引用对象,所有的引用最终都会消失。
另一方面,Jupyter notebook 仍在运行,而且它可能会保留对您的对象的引用以供内部工作......
在代码的最后一行放一个简单input()
的,你可以看到__del__
不会在 VScode 或终端中调用。
推荐阅读
- python - 替换列表中的所有值而不使用枚举?
- functional-programming - 您究竟如何在 Ocaml 中使用模块?
- batch-file - 字符串操作批量删除变量的一部分
- django - 在 django rest 框架中创建搜索过滤器
- reactjs - 在第二次加载 componentWillReceiveProps 后状态更新并且不会映射
- css - 以 Link 元素为中心的 Material UI
- android - 适用于旧 Android 版本的 Flutter
- vim - vim - 颜色方案未正确设置背景颜色
- c++ - 如果所述结构具有构造函数,则带有 new[] 的结构数组似乎不起作用
- javascript - 随机数不起作用,仅显示在第一个元素上