Pythonのコンテキストマネージャーの詳細な説明

コンテキストマネージャー

定義:コンテキスト管理プロトコルメソッドを実装するオブジェクト
関数を指します:主にリソース(開いているファイル、ネットワーク接続、データベース接続、オブジェクトのロックなど)を解放するために使用されます。

コンテキスト管理プロトコルの2つのメソッド:
** 1__enter __(self)**は、withステートメントブロック
** 2__exit __(self、type、value、tb)**でプログラムが使用するために参照できるリソースオブジェクトを作成して返します。コンテキストを終了する主にリソースを安全に解放するために使用されるときに呼び出されます

コンテキストマネージャーを使用したwithステートメントの形式は次のとおりです。

with context as val:
      pass

valは、コンテキストマネージャーの__enter __()メソッドによって返されるリソース参照を取得して、背後のコードブロックで使用します。

open関数の戻り値

with open("filename", encoding="utf-8") as fp:
      fp.read()

このコードの関数open()は、リソース(ファイルハンドル)ではなく、コンテキスト管理プロトコルメソッドを実装するオブジェクトを返します。これには、コンテキストマネージャーの__enter __(自己)メソッドがファイルハンドルを返す必要があります。 asの後の変数fpを参照するため。
Pythonの組み込み関数を使用して、open()によって返されるオブジェクトの属性を確認できます。
つまり、
ここに画像の説明を挿入します
ここに画像の説明を挿入します
open()–> context manager– > enter(self)–> resourcesです。

函数open
上下文管理器
__enter__
资源

独自のコンテキストマネージャーを実装することもできます。
コードは次のとおりです。

class MyFileMgr:
   def __init__(self, fp=None, filename):
      self.fp = fp
      self.filename = filename
      
   def __enter__(self):  # 主要用于返回一个可以引用的资源
      self.fp = open(self.filename, encoding="utf-8")
      return self.fp
   def __exit__(self, t, v, tb):  # 用于释放资源
      if self.fp:
         fp.close()

if __name__ == '__main__':
    with MyFileMgr as fp:
         fp.read()

Py標準ライブラリのコンテキストマネージャーに関連するモジュール:Contextlib:
ジェネレーターをコンテキストマネージャーに変換するデコレーターを提供します:contextmanager

import contextlib
@contextlib.contextmanager
def my_mgr(s, e):
    print(s)
    yield s + ' ' + e
    print(e)


if __name__ == "__main__":
    with my_mgr('start', 'end') as val:
        print(val)

ランニング効果:スタート
スタートエンド
エンド

コードのデバッグ:
ここに画像の説明を挿入します

この例で
は、ジェネレーターがコンテキストマネージャーに変換されるため、yieldの下のステートメントは、コンテキストマネージャーの__exit __()によりリソースを解放し、next()を実行し、出力終了を実行します。

おすすめ

転載: blog.csdn.net/weixin_43495262/article/details/106535318