如何使用contextmanagers作为实例变量

P3t*_*rus 8 python destructor with-statement

我如何使用Contextmanager实例变量?我们假设我有一些Connection课程,必须在破坏时关闭.如果我将它作为ContextManager实现,我可以做到.

with Connection() as c:
    c.write('FOO')
    c.ask('BAR?')
Run Code Online (Sandbox Code Playgroud)

它会在销毁时自动关闭.但是如果我想在__init__另一个类中使用它,例如下面的例子呢?

class Device(object):
    def __init__(self):
        self.connection = Connection()  # Must be closed on destruction.
Run Code Online (Sandbox Code Playgroud)

我不希望它在构造函数的退出时关闭,它应该在对象被破坏时死亡.我可以使用,__del__但这有它的缺点.习惯于在C++中使用RAII它让我感到困惑.

那么在这种情况下,最好的方法是什么?

Ned*_*der 6

您应该self.connection.close在您的Device.close()方法中调用,然后安排在程序中正确调用它,可能使用上下文管理器.

__del__ 永远不值得.