2017-12-31 63 views
0

クラスのインスタンスが何かを実行してwithステートメントのスコープを終了する前に上書きできるクラス属性はありますか?クラスが `with`ステートメントのスコープを終了したときにタスクを実行するようにする

with open(PATH, 'wb') as f: 
    f.write("SOME TEXT") 

私はこのようなクラスの寿命のために持続するライターを必要とするクラスを書いた場合:

例えば、我々は我々がそれを完了したら、我々はファイルハンドルを閉じることを確認することができます:

class MyWriter(object): 

    def __init__(self, path): 
     self.f = open(path, 'wb') 
     self.buffer = '' 

    def write(self, text): 
     self.buffer += text 
     # Just a toy example, naively relying on file system 
     # page cache should outperform this 
     if len(self.buffer) >= 4096: 
      self.flush() 

    def flush(self): 
     f.write(self.buffer) 
     self.buffer = '' 

    def close(self): 
     self.flush() 
     self.f.close() 

その後、私はwithの範囲を出る前に.close()のコールとフラッシュを強制したいと思います:

with MyWriter(PATH) as mw: 
    mw.write("SOME TEXT") 

答えて

0

あなたが探している用語はコンテキストマネージャです。これは、オブジェクトがwithステートメントで使用されたときに呼び出されるオブジェクトです。

公式のPythonのドキュメントには、非常に良いdocumentation on context managersがあります。 PEP 343には素晴らしい背景情報や良い例があります。

関連する問題