8

我如何将 Contextmanager 用于实例变量?例如,假设我有一些Connection课程,必须在销毁时关闭。如果我要将它实现为 ContextManager,我可以做到。

with Connection() as c:
    c.write('FOO')
    c.ask('BAR?')

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

class Device(object):
    def __init__(self):
        self.connection = Connection()  # Must be closed on destruction.

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

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

4

2 回答 2

6

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

__del__永远不值得。

于 2013-01-06T16:02:09.797 回答
1
from contextlib import contextmanager

@contextmanager
def connection():
    conn = Conn()
    try:
        yield conn
    finally:
        conn.close()

class Conn(object):
    def close(self):
        print('Closing')

class Device(object):
    def __init__(self, conn):
        self.conn = Conn()

with connection() as conn:
    d = Device(conn)
于 2015-07-30T00:49:11.697 回答