コードの一部を初めて目:
Fooクラス(オブジェクト): DEF __init __(自己): 印刷(「オブジェクトをインスタンス化') DEF __enter __(自己): 印刷('入力')
DEF __exit __(自己、exc_type、exc_val、exc_tb): 印刷('終了" ) OBJ =はFoo() OBJと: 印刷( '実行')
上記のコードの結果:
オブジェクトのインスタンス に 実行 出口
結論1
私たちは、それは、Fooのインスタンスをオブジェクトobjを取得し、最初の文を印刷しているのFooの__init__メソッドを実行知っています。
上から下へ、プログラムの実行によると、あなたは、それがエントリを表示します前に、最初に尋ねるのではなく、「進捗状況」を印刷する必要があり、それを印刷した後、それを終了しますか?
我々がfooを定義する場合、定義__enter__及び__exit__方法は、我々は、インスタンス化するので、オブジェクトOBJは、コンテキストマネージャであります
すなわち、メソッドを含むオブジェクトが__exit__ __enter__とコンテキストマネージャです。
:コンテキストマネージャとの 声明ボディ
コンテキストマネージャとの出会いの前に、体内のステートメントを実行__enter__方法のコンテキストマネージャを実行し、その後、最後の実行方法の__exit__文を実行した後、本体の後のステートメント本体を実行します
これは、記事の冒頭場合がある理由です。
このコードを見てください:
Fooクラス(オブジェクト): DEF __init __(自己): 印刷(「オブジェクトをインスタンス化') DEF __enter __(自己): 印刷('入力') DEF __exit __(自己、exc_type、exc_val、exc_tb): 印刷('終了" )
#trueを返し 、OBJ =はFoo() OBJと: 昇給はImportErrorの () 'を実行'を印刷
結果は以下の通りであります:
我々はアンコメントコメント行以上のコード、次の結果
我々 __exit__は体が体内に文を実行見た後に行われている間、私たち故意ローカルエラーを実行するために、通常の状況下では、エラーを投げるが、実行されませんが、ことがわかりますが、それでも__exit_を行いました_方法;私たちは時に値トゥーレの__exit__を返すようにする場合、それはエラーを無視します。
結論2
すべての我々は見つけることができます
同様の声明を持ちます
試してみてください。
除きます:
最後に:
機能:しかし、もっと簡潔な文で。そして、より安全。少ないコード。
__exit__がfalseを返す場合、例外が発生した場合、例外を処理するためのロジックと外部の声明を聞かせて、再スローされます(デフォルトでは、戻り値を書き込みません、それはFalseです)、これは一般的である。それはtrueを返す場合、ない例外に対処するために、例外を無視
Fooクラス(オブジェクト): DEF __init __(自己): 印刷( 'オブジェクトをインスタンス化') DEF __enter __(自己): 印刷( '入力') #リターン自己 DEF __exit __(自己、exc_type、exc_val、exc_tb): 印刷( '終了') fooで(OBJ AS): 印刷(OBJ、タイプ(OBJの)) を印刷( '実行')
我々はアンコメントコメント行以上のコード、次の結果
結論
あなたがメソッドのコンテキストマネージャを__enter__呼び出すと、句として使用する場合は__()メソッドは、ターゲットとして句に割り当てられている値を返します__enter
:ターゲットとして、コンテキストマネージャと コードステートメント体
コンテキストマネージャによって、として使用される場合、コンテキストマネージャの戻り値が__enter __()メソッドがターゲットに割り当てられている、ターゲットは単一の変数であってもよいし、「()」囲まれたタプルが続かなければなりませんで(それは単に「」変数のリストを分離することはできません、あなたは 『)(』追加する必要があります)
私たちはしばしば、このコードを参照してください。
:オープン( "を/ tmp / foo.txtの")ファイルとして付き )(データ= file.read
結論
ここでステートメントで使用にかかわらず、例外が処理ファイル中に発生するかどうかの、文の実装後に開いているファイルハンドルで閉鎖されていることを確認することができます。従来のtry /ついにパラダイムは、次のコードに似て採用された場合:
somefileという=オープン(r'somefileName ') 試してみてください。 somefileというの行のために: プリントライン #...より多くのコードを 最後に: somefile.close()
比較すると、文でコーディングの量を減らすことができます。支持体は、これにコンテキスト管理プロトコルならびにモジュール通し、小数と追加されました。
唯一のコンテキストマネージャが使用するとして、一般的なコンテキストマネージャがあります
ファイル decimal.Context thread.LockType threading.Lock threading.RLock threading.Condition threading.Semaphore threading.BoundedSemaphore
转载:https://www.cnblogs.com/huchong/p/8268765.html