@本文來源于公衆号:csdn2299,喜歡可以關注公衆号 程式員學府
本篇文章主要介紹了Python中的上下文管理器和with語句的使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟随小編過來看看吧
文章目錄
-
- 為什麼需要上下文管理器?
-
- 舉兩個例子:
- 上下文管理器怎麼使用?
- 上下文管理實作機制
- 上下文管理器實作
python2.5之後引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于規定某個對象的使用範圍。本文是針對于該功能的思考總結。
為什麼需要上下文管理器?
首先,需要思索下為什麼需要引入上下文管理器。
在正常情況下,管理各種系統資源(如檔案)、資料庫連接配接時,通常是先打開這些資源,執行完相應的業務邏輯,最後關閉資源。
舉兩個例子:
1.使用Python打開一個檔案寫入内容,之後需要關閉這個檔案。如果不正常關閉的話可能會在檔案操作時出現異常,因為系統允許你打開的檔案的最大數是有限的。
2.在資料庫連接配接時也是存在類似問題,資料庫的連接配接算是一種比較昂貴的資源,若連接配接過多而沒有及時關閉的話,就可能出現不能繼續連接配接的異常錯誤。
但是,很多程式員經常會忘記關閉檔案,或者關閉資料庫的連接配接。這時候就引入了上下文管理器,它可以在你不需要該對象的時候,自動關閉它。
上下文管理器怎麼使用?
上下文管理器的文法是:with…as…
執行個體:檔案操作
print "不使用上下文管理器"
print "*" * 30
f = open('file.py', 'w')
print f.closed
f.write("# Hello World")
f.close()
print f.closed
print "\n使用上下文管理器"
print "*" * 30
with open("file.py", 'w') as f:
print f.closed
f.write('# Hello Python')
print f.closed
這裡通過.closed比較,我們可以看到上下文管理器可以自動關閉檔案,對于上下文管理器而言,有隸屬于它的程式塊,當隸屬于它的程式塊執行結束的時候(判斷縮進),上下文管理器将自動關閉檔案。
上述執行個體,也可以使用try…except…來實作,同樣可以很直覺的看到使用with…as…語句之後,代碼确實相對更加簡潔。
上下文管理實作機制
因為檔案對象是Python的内置對象,内置了上下文管理的特殊方法,是以它可以使用with語句。在Python中,任何對象,隻要實作了上下文管理,就可以使用with語句,實作上下文管理需要通過__enter__和__exit__這兩個方法來實作。
關于這兩個方法:
enter(self):進入該對象時調用此方法,傳回值将放入with…as…語句中的as說明的變量中
exit(self, type, value, tb):離開上下文管理器時調用該方法,如果有異常出現,傳回False,type、value和tb将分别表示異常的類型、值和追蹤資訊,傳遞出上下文顯示;如果沒有異常,則三個變量的值均為None。
with 上下文管理器:
文法體
當with語句遇到上下文管理器時,就會在執行文法體之前,先執行__enter__方法,然後再執行文法體,執行完文法體之後,執行__exit__方法。
上下文管理器實作
使用Python2.7X實作一個上下文管理器:
class Context(object):
def __init__(self):
print "執行個體化一個對象"
def __enter__(self):
print "擷取該對象"
def __exit__(self, exc_type, exc_val, exc_tb):
print "退出該對象"
temp = Context()
with temp:
print "執行體"
這樣,__enter__方法和__exit__方法的調用過程就很明晰。
contextLib
在contextlib中,提供了contextmanager裝飾器,通過yield傳回函數将函數分隔為兩部分,yield之前的語句在__enter__中執行,yield之後的語句在__exit__中執行,簡化了上下文管理器的實作方式:
總結:通過上下文管理器,我們可以更好的控制對象在不同區間的特性,并且可以使用with語句替代try…except方法,使得代碼更加的簡潔,主要的使用場景是通路資源,可以保證不管過程中是否發生錯誤或者異常都會執行相應的清理操作,釋放出通路的資源。
非常感謝你的閱讀
大學的時候選擇了自學python,工作了發現吃了計算機基礎不好的虧,學曆不行這是沒辦法的事,隻能後天彌補,于是在編碼之外開啟了自己的逆襲之路,不斷的學習python核心知識,深入的研習計算機基礎知識,整理好了,我放在我們的微信公衆号《程式員學府》,如果你也不甘平庸,那就與我一起在編碼之外,不斷成長吧!
其實這裡不僅有技術,更有那些技術之外的東西,比如,如何做一個精緻的程式員,而不是“屌絲”,程式員本身就是高貴的一種存在啊,難道不是嗎?[點選加入]想做你自己想成為高尚人,加油!