首页 > 解决方案 > 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));

标签: pythonpython-3.xdestructor

解决方案


最好调用__del__终结器方法,因为该方法会在对象即将被垃圾回收时被调用。(比如当所有对该对象的引用都消失了。)

在 VSCode 中,甚至当您在终端中运行脚本时,当解释器到达文件末尾时,它将终止执行和进程,因此任何对象都将被销毁。所以你可以看到这个方法被调用了。所以即使你没有del明确地引用对象,所有的引用最终都会消失。

另一方面,Jupyter notebook 仍在运行,而且它可能会保留对您的对象的引用以供内部工作......

在代码的最后一行放一个简单input()的,你可以看到__del__不会在 VScode 或终端中调用。


推荐阅读