如何在Python中收集垃圾时指定对象的清理行为?

时间:2016-03-18 04:13:18

标签: python python-2.7 garbage-collection

假设我有一些管理数据库连接的类。用户应该在此类的实例上调用close(),以便彻底终止数据库连接。

如果解释器关闭或垃圾收集器以其他方式拾取对象,python中有没有办法让这个对象调用close()

编辑:这个问题假设对象的用户未能在with块内实例化它,因为他忘记了或者不关心关闭连接。

2 个答案:

答案 0 :(得分:2)

如果您不信任用户正在使用__del__docs),则会调用确保此类方法的唯一方法。来自文档:

  

当实例即将被销毁时调用。

请注意,使用del棘手的问题有很多。例如,在调用它时,解释器可能已经关闭 - 这意味着其他对象和模块可能已经被破坏。有关详细信息,请参阅注释和警告。

如果你真的不能依赖用户同意成年人,我会阻止他们隐含地避免close - 首先不要给他们公开open。仅提供支持with的方法。如果有人明确地挖掘你的代码,那么他们可能有充分的理由。

答案 1 :(得分:1)

在您的课程中定义__enter____exit__方法,然后将其与with statement一起使用:

with MyClass() as c:
    # Do stuff

with块结束时,将自动调用__exit__()方法。