Skip to main content

03-析构函数

析构函数(Destructor)是什么?

析构函数是一个特殊的方法,在对象被销毁时自动执行,它用于释放资源,比如关闭文件、断开数据库连接、释放内存等?

在 Python 中,析构函数的名称是 __del__,当对象不再被引用或程序结束时,Python 的垃圾回收机制会自动调用它。

1.析构函数的基本用法

class Example:
def __init__(self, name):
self.name = name
print(f"对象 {self.name} 被创建")

def __del__(self):
print(f"对象 {self.name} 被销毁")


# 创建对象
obj = Example("Test")

# 删除对象
del obj # 这里会调用 __del__ 方法

输出:

对象 Test 被创建
对象 Test 被销毁

2.析构函数的触发时机

析构函数 __del__ 会在对象不再被引用时触发,包括:

  • 使用 del 删除对象
  • 超出作用域(比如函数执行结束)
  • 程序结束时 Python 进行垃圾回收

示例:作用域结束触发析构

def create_object():
obj = Example("局部变量") # 创建对象
print("函数结构,即将销毁对象")


create_object()

输出:

对象 局部变量 被创建
函数结构,即将销毁对象
对象 局部变量 被销毁

create_object() 执行完毕后,obj 超出作用域,没有其它引用,它会被销毁。

3.析构函数的应用场景

(1)释放文件资源

class FileHandler:
def __init__(self, filename):
self.file = open(filename, 'w')
print(f"打开文件 {filename}")

def write_data(self, data):
self.file.write(data)

def __del__(self):
print("关闭文件")
self.file.close()


# 创建对象
handler = FileHandler("example.txt")
handler.write_data("Hello, World!")

# 对象销毁时,文件会自动关闭
del handler

输出:

打开文件 example.txt
关闭文件

(2)断开数据库连接

class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
print(f"连接到数据库 {self.db_name}")

def __del__(self):
print(f"断开数据库 {self.db_name} 的连接")


# 创建数据库连接对象
db = DatabaseConnection("MyDB")

# 删除对象,触发析构函数
del db

输出:

连接到数据库 MyDB
断开数据库 MyDB 的连接

4.需要注意的事项

(1)Python 的垃圾回收

  • Python 采用 引用计数(Reference Counting) 机制,只有当 对象的引用计数变为0 时,__del__才会执行。
  • 如果有循环引用(对象互相引用),可能不会自动销毁,这时可以使用 gc.collect() 强制垃圾回收。

(2)__del__ 不能确保立即执行

  • Python 不保证 __del__ 立即执行,尤其是在 Python 解释器退出时,某些对象可能不会被销毁。
  • 因此,建议手动释放关键资源 (如 with open() 语句,或 try-finally 结构)。

5.总结

特点描述
作用在对象销毁时自动执行,释放资源
定义方式使用 __del__(self)
触发时机del 删除对象、作用域结束、垃圾回收
典型应用关闭文件、释放内存、断开数据库连接

析构函数在某些情况下很有用,但在 Python 中,由于 自动垃圾回收,很多时候可以用 with 语句或 try-finally 代替。

6.注意事项

  1. 构造函数和析构函数一样,不能有返回值
  2. 析构函数不能有参数
  3. 一个类只能有一个析构函数;
  4. 析构函数在对象销毁时被调用。