Python2.5以後引入了上下文管理器(context manager),算是Python的黑魔法之一,它用於規定某個對象的使用範圍。本文是針對於該功能的思考總結。程序員
首先,須要思索下爲何須要引入上下文管理器。
在正常狀況下,管理各類系統資源(如文件)、數據庫鏈接時,一般是先打開這些資源,執行完相應的業務邏輯,最後關閉資源。
舉兩個例子:數據庫
可是,不少程序員常常會忘記關閉文件,或者關閉數據庫的鏈接。這時候就引入了上下文管理器,它能夠在你不須要該對象的時候,自動關閉它。函數
上下文管理器的語法是:with...as...code
實例:文件操做對象
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__這兩個方法來實現。
關於這兩個方法:博客
with 上下文管理器: 語法體
當with語句遇到上下文管理器時,就會在執行語法體以前,先執行__enter__方法,而後再執行語法體,執行完語法體以後,執行__exit__方法。it
使用Python2.7X實現一個上下文管理器:class
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方法,使得代碼更加的簡潔,主要的使用場景是訪問資源,能夠保證無論過程當中是否發生錯誤或者異常都會執行相應的清理操做,釋放出訪問的資源。
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成轉載需註明出處,且在文章頁面明顯位置給出原文連接。