Pythonで` with `ステートメントを持つコンテキストマネージャ



コンテキストマネージャは何ですか?
2つのマジックメソッドを実装するクラスのコンテキストの開始と終了時に通知されるオブジェクトです__enter__ and __exit__ 必要に応じて他の方法.
たとえば、コンテキストマネージャが終了すると、オブジェクトファイルが閉じられます.
with open('test_ch30.txt' , 'w+') as file:
    file.write('Blew the lid of ur life')

 # the open file has automaticlly been clossed 
コンテキストマネージャは、一般的に、システムメモリを節約し、実行中に各プロセスがそのリソースを保持することによってリソース管理を改善するために、ファイルを読み書きするときに使用されます.

Opening a file using with statement ensures that File descriptor are closed automatically.



ハウwith statmentコンテキストマネージャを実装しますか?
1 -オブジェクトがAと呼ばれるときwith 状態
インタプリタを呼び出す__eneter__ 使用するメソッド
必要に応じて必要なセットアップコードを呼び出して
プロセスは、前にwith 状態
2 -ときにwith ステータスが終了すると、インタプリタが呼び出します__exit__ メソッド.
幻想


Contect Managerクラスを実装するには何が必要ですか?
class ContextManager(object):
    """docstring for ContextManager"""
    def __init__(self):
        pass

    def __enter__(self):
        print("__enter__()")
        # optionaly return an obj
        return "an instance"

    def __exit__(self , exc_type , exc_val , traceback):
        print("__exit__ with " , exc_val if exc_val else ' nope')


with ContextManager() as e:
    print("is a " , e)


複数のコンテキストマネージャ

with open('test_ch30.txt') as input_file, open('test_ch77.txt', 'w') as output_file:
    # do something with both files.
    # e.g. copy the contents of input_file into output_file
    for line in input_file:
        output_file.write(line + '\n')

# It has the same effect as nesting context managers:
with open('test_ch30.txt') as input_file:
    with open('test_ch77.txt', 'w') as output_file:
        for line in input_file:
            output_file.write(line + '\n')


資源管理
class File():
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
    def __enter__(self):
        self.open_file = open(self.filename, self.mode)
        return self.open_file
    def __exit__(self, *args):
        self.open_file.close()


for _ in range(10000):
    with File('test_ch30.txt', 'w') as f:
        f.write('foo')


次に示すクラスを.
コンテキストマネージャを使用してコンテキストマネージャを起動しますCode link