Pythonで` with `ステートメントを持つコンテキストマネージャ
9051 ワード
コンテキストマネージャは何ですか?
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
Reference
この問題について(Pythonで` with `ステートメントを持つコンテキストマネージャ), 我々は、より多くの情報をここで見つけました https://dev.to/rowida46/context-managers-with-with-statment-59dpテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol