马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
感觉代码里面的del self.new_file这一步有点多余,不需要写,也可以释放内存class FileObject:
'''给文件对象进行包装从而确认在删除时文件流关闭'''
def __init__(self, filename='sample.txt'):
#读写模式打开一个文件
self.new_file = open(filename, 'r+')
def __del__(self):
self.new_file.close()
del self.new_file
def enter(self,string=''):
self.new_file.write(string)
上面是小甲鱼提供的代码,为了检验这个del,我加了个enter方法进去
假如我实例化 f=FileObject('1.txt')
首先删除实例化对象的时候,用del d 来删除这个实例对象的时候,如果没有别的引用应该就直接被垃圾回收机制回收掉了
也就是这时候已经不存在这个f,相应的也执行了里面的关闭文件了,然后再把储存这个变量的内存释放掉。
在shell运行的时候,也证明了f.close()只是关闭了文件,但是存储f这个内存还没被释放f=open('123.txt')
>>> f.close()
>>> f
<_io.TextIOWrapper name='123.txt' mode='r' encoding='cp936'>
>>> del f
>>> f
Traceback (most recent call last):
File "<pyshell#115>", line 1, in <module>
f
NameError: name 'f' is not defined
但是考虑到课上小甲鱼说的一种情况,实例化f之后,我通过a=f来给这个实例贴多一个标签
这时候,只有del a 和 del f都执行了,才会执行类对象里面的del方法,这时候反过来看,就感觉del self.new_file这一步有点多余了f=F('123.txt')
>>> a=f
>>> id(a)
2509003960960
>>> id(f)
2509003960960
>>> del a
>>> f.enter('123')
>>> a.enter('123')
Traceback (most recent call last):
File "<pyshell#134>", line 1, in <module>
a.enter('123')
NameError: name 'a' is not defined
同时如果我不写这一句del self.new_file,当我删除了f 和 a的时候,也是同样的效果 |