【1.134】__del__ 清除对象的同时回收系统资源,这就用到了__del__
析构方法,当对象在内存中被释放时,自动触发执行。
注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,
如果产生的对象的同时还会向操作系统发起系统调用,
即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),
则必须在清除对象的同时回收系统资源,这就用到了__del__
class Foo: def __del__(self): print('执行我啦') f1=Foo() del f1 print('------->') #输出结果 删除对象前,回收系统资源 执行我啦 ------->
典型的应用场景:
创建数据库类,用该类实例化出数据库链接对象,
对象本身是存放于用户空间内存中,而链接则是由操作系统管理的,存放于内核空间内存中
当程序结束时,python只会回收自己的内存空间,
即用户态内存,而操作系统的资源则没有被回收,
这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源
class Foo: def __del__(self): print('执行我啦') f1=Foo() # del f1 print('------->') #输出结果 # -------> # 执行我啦 代码执行完,要进行资源回收,但这个是用户级别的回收,如打开了系统管理的资源,就要在del里面写回收系统资源的代码
当程序结束时,python只会回收自己的内存空间,即用户态内存,
而操作系统的资源则没有被回收,这就需要我们定制__del__,
在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源
这与文件处理是一个道理:
f=open('a.txt') #做了两件事,在用户空间拿到一个f变量,在操作系统内核空间打开一个文件 del f #只回收用户空间的f,操作系统的文件还处于打开状态 #所以我们应该在del f之前保证f.close()执行,即便是没有del,程序执行完毕也会自动del清理资源,于是文件操作的正确用法应该是 f=open('a.txt') 读写... f.close() 很多情况下大家都容易忽略f.close,这就用到了with上下文管理
浙公网安备 33010602011771号