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.closeDevice.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 に答える