Python 如何销毁一个对象

Python 如何销毁一个对象

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

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

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

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

使用__del__()方法

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

示例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类创建一个对象。
  • 然后将对象引用d赋给新的对象d1,即 d1=d。
  • 此时,同一个对象被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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程