Python進階-魔術方法(3)


3樓貓 發佈時間:2024-08-12 14:27:36 作者:贏贏贏贏麻 Language

前言

前篇:

魔術方法(1):使用__str__與__repr__進行字符串操作

魔術方法(2):使用__iter__與__next__實現可迭代

正文

魔術方法(3):使用__enter__與__exit__創建上下文管理器

但凡寫過Python的人,肯定不會對下列代碼感到陌生,這也是Python裡面我最喜歡的語法糖

如果你還接觸過其他編程語言(比如C和Java),都會感嘆Python語法的簡單,因為我們不需要考慮文件的打開和關閉,也不需要封裝異常處理,這是如何實現的?

Python進階-魔術方法(3)-第0張

打開並讀取一個文件

這正是上下文管理器的威力

所謂上下文管理器,也就是管理這一段代碼周圍其他代碼的一個小工具,比如上文的as f中的f就是一個上下文管理器,他會控制我說的文件打開和關閉以及異常處理,這些都歸功於__enter____exit__

專業點來說:

上下文管理器,即context manager,它是一個對象,定義了運行時的上下文,使用with語句來執行

實際上就是為該對象定義了一個時間段,在時間段開始的時候對做一件事情,在時間段結束的時候會做另外一件事情,在時間段開始和結束之間,可以使用該對象

----------分割----------

讓我先給出一段示例代碼,來展示這兩個魔術方法的作用,請務必根據打印的步驟順序,理解上下文管理器的執行順序

Python進階-魔術方法(3)-第1張

使用魔術方法實現一個定時器

Python進階-魔術方法(3)-第2張

運行結果

只要一個類實現了__enter____exit__,我們就可以把它稱為上下文管理器

  1. __enter__方法沒有參數,返回值會交給with……as……進行綁定

    該方法主要用於安裝上下文,返回管理器本身進行綁定

    上下文管理器對象遇到with語句後才會執行__enter__方法,這個方法的返回值會綁定給as後面的變量

  2. __exit__方法有三個參數,全部都是與異常相關的參數,當沒有發生異常的時候,參數為None,我們可以通過參數類型來判斷上下文管理器是否是正常結束,還是因為異常而結束,又是因為哪些異常。可以編寫一系列異常類型判斷來決定執行哪些操作

    該方法有一個返回值,是bool類型,如果為True會壓制運行過程中的一切異常,反之不壓制,我們可以主動製造異常(如拋出一個Exception)來驗證這一點

    該方法主要用於清除(釋放)對象

    當上下文管理器結束的時候會執行__exit__方法,用來處理異常與釋放對象

----------分割----------

上下文管理器有著極為強大的功能,所以它是我最喜歡的Python語法

你可以依賴這兩個方法實現許多操作,比如

  • 依靠__enter__實現用戶權限的驗證

  • 依靠__exit__實現文件、網絡鏈接、數據庫鏈接等重要資源的關閉

只要你處在上下文管理器的範圍之內,哪怕你使用sys.exit(0)Ctrl+C這種強制結束應用的操作,也會順利進入__exit__方法內部執行結束操作

在下列代碼中,我使用sys.exit(0)強制結束這個程序,但是上下文管理器依然頑強的進入了__exit__,忠心耿耿地執行完整個關閉操作,我們可以清楚的看到打印的異常類型為SystemExit,也就是系統退出

正是由於這種強大的抗干擾能力,我們才能夠在各種場合中使用with open語句來隨意打開文件而不需要擔心文件的關閉問題

Python進階-魔術方法(3)-第3張

強大的異常應對能力


© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com