1. __del__使用open的问题
在类里面调用__del__方法,使用open()打开文件会报错,如下:
代码:
# 类里面的部分代码
def __del__(self):
with open("test2.txt", "rb") as f2:
with open("test.txt", "ab") as f1:
f1.write(f2.read())
运行结果:
同理,python3的__del__中使用logging模块写入log时也会报错。
2. 解决方案
2.1 方法一
第一种方法:在__del__前使用open打开,然后在__del__进行相关操作并关闭文件,如下:
# !/usr/bin python3
# encoding : utf-8 -*-
class Test():
def __init__(self):
# 也不一定要在init中打开,在del之外的地方打开都可以
self.file_obj = open("test.txt","w+", encoding="utf-8")
pass
def __del__(self):
# 在del中使用open方法会报错
# file_obj = open("test.txt","w+", encoding="utf-8")
self.file_obj.writelines("微信公众号:xiaoqiangclub")
self.file_obj.close()
if __name__ == "__main__":
obj = Test()
2.2 方法二
第二种方式:导入atexit 模块,在类初始化函数中注册一个析构函数,拥有与__del__函数同样的效果如下:
# !/usr/bin python3
# encoding : utf-8 -*-
from atexit import register
class Text:
def __init__(self):
register(self.del_func)
pass
def del_func(self):
with open("test.txt", "rb") as f:
print(f.read())
if __name__ == '__main__':
Text()