|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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的时候,也是同样的效果 |
|