1. 程式人生 > >python魔術方法(二)

python魔術方法(二)

contex height con text 例如 數據庫連接 test eba 網絡

上下文管理:

文件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魔術方法(二)