在Python 2.7.x中通过类的__del__方法关闭sqlite3连接是否可疑?
我有一个类,在它的初始化方法(__init__)里打开了一个SQLite数据库,我想在稍后通过对创建的对象使用内置的删除(del)功能来关闭这个数据库。
我的析构函数(也就是用来清理资源的函数)是这样的:
def __del__(self):
self.connector.close()
这样关闭数据库连接是否安全呢?
2 个回答
0
是的,在 __del__()
方法里关闭连接是很不靠谱的。这个方法什么时候被调用,完全是垃圾回收器的决定。可能它根本不会被调用,或者在你已经建立了另一个数据库连接之后才会被调用。
你必须自己去调用 close()
方法。我通常会在我的连接包装类里添加一个 close()
方法,并确保它能通过 try / finally
结构被调用。
在至少一个应用中,我发现有必要在完成连接后,除了调用 commit()
或 rollback()
之外,还要确保调用 close()
。
2
不,如果这个对象还在使用中,发生异常时,析构函数是不会被调用的。可以看看这个其他的SO问题。
正如那里提到的,你应该把你的类改成一个上下文管理器,这样就可以在with
语句中使用。这能确保它的__exit__
方法总是会被调用。
你还可以了解一下contextlib模块,这个模块可以让你更方便地创建这样的上下文管理器。