【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上下文管理

 

posted @ 2019-07-03 18:23  科学小怪癖  阅读(195)  评论(0)    收藏  举报