我应该拆除在初始化中构造的所有资源吗?

2022-12-01 04:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常创建一些类,这些类在内部使用一些资源,比如请求会话、IMAP连接。我在__init__中初始化这些资源。你知道吗

例如:

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

所以主要的问题是:我应该手动释放这些资源,比如会话、imap\u连接,还是在GC运行时让它们死掉比较安全,或者不安全,如果是这样,最好的解决方案是什么?你知道吗

据我所知,除了实现一些free_resources方法并显式调用它之外,还实现了__enter__,它返回self和一个__exit__方法,该方法会分解所有这些资源。然后我使用with块实例化这些类。你知道吗


Tags: 方法selfinitsessiondefloginpassword资源connectionrequestsclassimapsomeclass
1条回答
网友
1楼 · 发布于 2022-12-01 04:15:40

上下文管理器支持(对with块的支持)是最可移植、一致的方法。否则,假设资源定义了它们自己的__del__清理,那么,除非引用循环,否则在CPython中,当所有者实例丢失最后一个引用时,它们将被清理。不幸的是,如果在cpython3.4之前有一个循环,那么循环中的__del__终结器将阻止循环GC清除该循环,因此内存泄漏并且不调用终结器。在3.4+中,它可能最终会被清除,但由于需要循环收集,所以时间不会是确定的。你知道吗