Python 中的析构函数
Destructor in 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 仍然是 运行ning,而且它可能会保留对您的对象的引用以供内部工作...
在代码的最后一行放置一个简单的 input()
,您可以看到 __del__
也不会在 VScode 或终端中被调用。
下面是代码。我没有手动 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 仍然是 运行ning,而且它可能会保留对您的对象的引用以供内部工作...
在代码的最后一行放置一个简单的 input()
,您可以看到 __del__
也不会在 VScode 或终端中被调用。