ディレクトリ
理解とコンテキストマネージャのパイソンを使用して
コンテキストマネージャとは何ですか?
- マネージャは、任意のコードブロックラッパーコンテキストオブジェクトです。
- コンテキストマネージャは、コンテキストマネージャへのアクセス、毎回の実行コードの整合性を確保します。
- あなたはコンテキストマネージャを終了すると、関連するリソースが適切にリサイクルすることができます。
簡単に言えば、コンテキストマネージャです with 语句
コンテキストマネージャを使用する利点
-
そのようなファイル操作、データベース接続などのリソース、(作成/取得/解放)を、よりエレガントな方法で操作することができます。
-
ファイルを閉じるには行っていない、コードより簡潔を作り、コードを書くことで文と、終了ステップの実施を確保することができる必要があります。
-
これは、例外を処理するために、よりエレガントな方法であってもよいです。
コンテキストマネージャを使用します
そのようなAのコンテキストの経営を実現するには、最初のコンテキスト管理プロトコルを知っている必要があります。
単にクラスにあることを、つけ、このクラスのインスタンスは、コンテキストマネージャです。实现了 enter 和__exit__的方法
# 上下文管理协议
class Sample:
def __enter__(self):
print("enter")
# 获取资源
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# 释放资源
print("exit")
def do_something(self):
print("doing something")
with Sample() as sample:
sample.do_something()
出力:
enter
doing something
exit
コードを書くときに明確に、この例から見ることができ、または接続__enter__資源に取得することができ、リソースが__exit__でオフに書かれています。
contextlib簡素化コンテキストマネージャ
# 让普通函数也可以使用上下文管理, 前提条件是add函数必须是生成器函数,且只有yield语句
from contextlib import contextmanager
@contextmanager
def add(x, y):
print('__enter__') # 第一步:调用__enter__
yield x + y # 第二步:返回__enter__函数的返回值给obj对象
print('__exit__') # 第四步:调用__exit__
with add(1, 2) as obj:
print(obj) # 第三步:执行上下文语句块
出力:
__enter__
3
__exit__
- contextlib Pythonの標準ライブラリモジュールは、よりユーザーフレンドリーなコンテキスト管理ツールモジュールを提供することです。
- これは、デコレータによって実現され、クラスおよび使用__enter__と__exit__これら2つのメソッドを作成する必要はありません、それは声明でより便利です。
- @contextmanagerは、AS ...発電機、変数に割り当てられた値と収率の発生を受けて、通常の文章を用いて行わデコレータデコレータ、発電機です。
- ()、また@contextmanager後に装飾的なデコレータを閉じる閉じると文で使用(!このオブジェクトはclose()メソッドを呼び出すことができるものとする)は、オブジェクトコンテキストオブジェクトになることができます。
参考:コンテキストマネージャ