如何在Python中销毁对象?


当对象被删除或销毁时,会调用析构函数。在终止对象之前,会使用析构函数完成清理任务,例如关闭数据库连接或文件句柄。

Python中的垃圾回收器会自动管理内存。例如,当对象不再相关时,它会清除内存。

在Python中,析构函数是完全自动的,永远不会手动调用。在以下两种情况下,会调用析构函数:

  • 当对象不再相关或超出作用域时
  • 对象的引用计数达到零。

使用__del__()方法

在Python中,析构函数是使用特定的函数__del__()定义的。例如,当我们运行del 对象名时,对象的析构函数会自动被调用,然后它会被垃圾回收。

示例1

以下是使用__del__()方法的析构函数示例:

# creating a class named destructor class destructor: # initializing the class def __init__(self): print ("Object gets created"); # calling the destructor def __del__(self): print ("Object gets destroyed"); # create an object Object = destructor(); # deleting the object del Object;

输出

以下是上述代码的输出:

Object gets created
Object gets destroyed

注意 - 上述代码中的析构函数在程序运行结束后或删除对对象的引用后被调用。这表明对象的引用计数现在降为零,而不是当它离开作用域时。

示例2

在下面的示例中,我们将使用Python的del关键字来销毁用户定义的对象:

class destructor: Numbers = 10 def formatNumbers(self): return "@" + str(Numbers) del destructor print(destructor)

输出

以下是上述代码的输出:

NameError: name 'destructor' is not defined

我们得到上述错误,因为“析构函数”被销毁了。

示例3

在下面的示例中,我们将看到:

  • 如何使用析构函数
  • 当我们删除对象时,析构函数是如何被调用的?
class destructor: # using constructor def __init__(self, name): print('Inside the Constructor') self.name = name print('Object gets initialized') def show(self): print('The name is', self.name) # using destructor def __del__(self): print('Inside the destructor') print('Object gets destroyed') # creating an object d = destructor('Destroyed') d.show() # deleting the object del d

输出

我们使用上面的代码创建了一个对象。一个名为d的引用变量用于标识新生成的 对象。当对对象的引用被销毁或其引用计数为0时,析构函数已被调用。

Inside the Constructor
Object gets initialized
The name is Destroyed
Inside the destructor
Object gets destroyed

关于析构函数需要注意的事项

  • 当对象的引用计数达到0时,将为该对象调用__del__方法。
  • 当应用程序关闭或我们使用del关键字手动删除所有引用时,该对象的引用计数将降为零。
  • 当我们删除对象引用时,析构函数不会被调用。它只有在删除对所有对象的引用后才会运行。

示例

让我们用这个例子来理解上面提到的原理:

  • 使用d = destructor("Destroyed"),首先为student类创建一个对象。
  • 接下来,使用d1=d将对象引用d赋给新对象d1。
  • 现在,同一个对象被d和d1变量引用。
  • 之后,我们删除了引用d。
  • 为了理解析构函数只有在删除对对象的所有引用时才起作用,我们在主线程中添加了10秒的睡眠时间。
import time class destructor: # using constructor def __init__(self, name): print('Inside the Constructor') self.name = name print('Object gets initialized') def show(self): print('The name is', self.name) # using destructor def __del__(self): print('Inside the destructor') print('Object gets destroyed') # creating an object d = destructor('Destroyed') # Creating a new reference where both the reference points to same object d1=d d.show() # deleting the object d del d # adding sleep and observing the output time.sleep(10) print('After sleeping for 10 seconds') d1.show()

输出

正如您在输出中看到的,析构函数只有在删除对所有对象的引用后才会被调用。

此外,一旦程序运行结束并且对象已准备好进行垃圾回收,就会调用析构函数。(也就是说,我们没有显式地使用del d1来删除对象引用d1)。

Inside the Constructor
Object gets initialized
The name is Destroyed
After sleeping for 10 seconds
The name is Destroyed

更新于:2022年8月18日

21K+ 浏览量

启动你的职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.