python with 語句妙用
阿新 • • 發佈:2017-08-26
body 原理 value 協議 span print int ger world
class aa(): def bb(self): print("hhhh") return "hello world" def __enter__(self): # 必須有__enter__ print("enter") return self def cc(self): print("www") def __exit__(self, exc_type, exc_val, exc_tb): # 必須有結束__exit__ print("exit") def ll(): with aa() as a: return a.bb() res = ll() print(res)
結果:
enter
hhhh
exit
hello world
原理:自定義上下文管理器
開發人員可以自定義支持上下文管理協議的類。自定義的上下文管理器要實現上下文管理協議所需要的 __enter__() 和 __exit__() 兩個方法: context_manager.__enter__() :進入上下文管理器的運行時上下文,在語句體執行前調用。with 語句將該方法的返回值賦值給as 子句中的 target,如果指定了 as 子句的話 context_manager.__exit__(exc_type, exc_value, exc_traceback) :退出與上下文管理器相關的運行時上下文,返回一個布爾值表示是否對發生的異常進行處理。
參數表示引起退出操作的異常,如果退出時沒有發生異常,則3個參數都為None。如果發生異常,返回 True 表示不處理異常,否則會在退出該方法後重新拋出異常以由 with 語句之外的代碼邏輯進行處理。如果該方法內部產生異常,則會取代由 statement-body 中語句產生的異常。
要處理異常時,不要顯示重新拋出異常,即不能重新拋出通過參數傳遞進來的異常,只需要將返回值設置為 False 就可以了。之後,上下文管理代碼會檢測是否 __exit__() 失敗來處理異常
python with 語句妙用