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