python魔術方法(二)
上下文管理:
文件IO操作可以對文件對象使用上下文管理,使用with...as語法
with open(‘test‘) as f: pass
當一個對象同時實現了__enter__()和__exit__()方法,就屬於上下文管理的對象
__enter__:進入與此對象相關的上下文,如果存在該方法,with語法會把該方法的返回值綁定到as子句中指定的變量上,換句話說就是__enter__方法的返回值就是上下文使用的對象,with語法會把這個返回值賦給as子句的變量上
__exit__:退出與此對象相關的上下文
例:
實例化對象的時候,並不會調用enter,進入with語句塊調用__enter__方法,然後執行語句體,最後離開with語句塊的時候,調用__exit__方法。
with可以開啟一個上下文運行環境,在執行之前做一些準備工作,執行後做一些收尾工作
__enter__方法沒有參數
__exit__方法有3個參數:
__exit__(self,exc_type,exc_value,traceback),如果該上下文退出時沒有異常,這三個參數都為None。
如果有異常,參數意義如下:exc_type:異常類型,exc_value:異常的值,traceback:異常的追蹤信息
__exit__方法返回一個等效True的值,則壓制異常,否則,繼續拋出異常
例:為加法函數計數
一:使用裝飾器顯示該函數的執行時長
二、使用上下文實現
三、使用可調用對象實現
三、將類作為裝飾器使用
上下文應用場景:
1、增強功能,在代碼執行的前後增加代碼,以增強功能,類似裝飾器的功能
2、資源管理,打開了資源需要關閉,例如文件對象,網絡連接,數據庫連接等
3、權限驗證,在執行代碼前,做權限的驗證,在__enter__中處理
contextlib.contexymanager:
它是一個裝飾器實現上下文管理,裝飾一個函數,不用像類一樣實現__enter__和__exit__方法
如果業務邏輯簡單可以使用函數加contextlib.contextmanager裝飾器方式,如果業務復雜,用類的方式加__enter__和__exit__方法方便。
python魔術方法(二)