假设我有一些管理数据库连接的类。用户应该在此类的实例上调用close()
,以便彻底终止数据库连接。
如果解释器关闭或垃圾收集器以其他方式拾取对象,python中有没有办法让这个对象调用close()
?
编辑:这个问题假设对象的用户未能在with
块内实例化它,因为他忘记了或者不关心关闭连接。
答案 0 :(得分:2)
如果您不信任用户正在使用__del__
(docs),则会调用确保此类方法的唯一方法。来自文档:
当实例即将被销毁时调用。
请注意,使用del棘手的问题有很多。例如,在调用它时,解释器可能已经关闭 - 这意味着其他对象和模块可能已经被破坏。有关详细信息,请参阅注释和警告。
如果你真的不能依赖用户同意成年人,我会阻止他们隐含地避免close
- 首先不要给他们公开open
。仅提供支持with
的方法。如果有人明确地挖掘你的代码,那么他们可能有充分的理由。
答案 1 :(得分:1)
在您的课程中定义__enter__
和__exit__
方法,然后将其与with
statement一起使用:
with MyClass() as c:
# Do stuff
当with
块结束时,将自动调用__exit__()
方法。