我应该拆除__init__中构建的所有资源吗?

时间:2015-10-29 19:49:09

标签: python

我经常创建在内部使用某些资源的类,例如请求会话,IMAP连接。我在__init__初始化了这些资源。

例如:

class SomeClass:
    def __init__(self, login, password):
        self.session = requests.Session()
        self.imap_connection = IMAPLib.connect(...)
        ... and so on ...

所以主要的问题是:我应该手动释放这些资源,例如会话,imap_connections,或者让它们在GC运行时死亡或者它不安全是非常安全的,如果是的话,什么是最佳解决方案?

据我所知,除了实现一些free_resources方法并明确调用它之外,还要实现__enter__,它返回self__exit__方法,这会耗尽所有这些资源。然后我使用with块实例化这些类。

1 个答案:

答案 0 :(得分:0)

上下文管理器支持(对with块的支持)是最便携,一致的方法。否则,假设资源定义了自己的__del__清理,然后禁止引用循环,在CPython中,当所有者实例丢失其最后引用时,它们将被清除。不幸的是,如果循环,在CPython 3.4之前,循环中存在__del__终结器将阻止循环GC完全清除循环,因此内存泄漏并且没有调用终结器。在3.4+中,它可能最终会被清理,但由于需要进行循环收集,时间不会是确定性的。