在python中, 如果我们在一个类的析构函数__del__中打开文件, 这个打开文件的操作会失败. 比如, 我们尝试运行以下程序:
from 翻译包 import *
class 存储代理:
def __init__(self):
输出("开始")
def __del__(self):
输出("打开文件前")
with open("./测试.txt", "w") as 文件:
pass
输出("打开文件后")
代理 = 存储代理()
其运行结果如下:
为解决这一问题, 我们可以首先导入atexit模块, 然后将析构操作写入另一个函数中, 最后用atexit.register来注册这个函数. 比如, 以上程序可以改写如下:
from 翻译包 import *
import atexit
class 存储代理:
def __init__(self):
atexit.register(self.cleanup)
输出("开始")
def cleanup(self):
输出("打开文件前")
with open("./测试.txt", "w") as 文件:
pass
输出("打开文件后")
代理 = 存储代理()
其运行结果如下: