with 語句適用於對資源進行訪問的場合,確保無論使用過程當中是否發生異常都會執行必要的「清理」操做,釋放資源,好比文件使用後自動關閉、線程中鎖的自動獲取和釋放等。線程
with 的工做原理:code
要使用 with 語句,首先要明白上下文管理器這一律念。有了上下文管理器,with 語句才能工做。對象
下面是一組與上下文管理器和with 語句有關的概念。ip
上下文管理協議(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持資源
該協議的對象要實現這兩個方法。it
上下文管理器(Context Manager):支持上下文管理協議的對象,這種對象實現了io
__enter__() 和 __exit__() 方法。上下文管理器定義執行 with 語句時要創建的運行時上下文,class
負責執行 with 語句塊上下文中的進入與退出操做。一般使用 with 語句調用上下文管理器,原理
也能夠經過直接調用其方法來使用。方法
運行時上下文(runtime context):由上下文管理器建立,經過上下文管理器的 __enter__() 和
__exit__() 方法實現,__enter__() 方法在語句體執行以前進入運行時上下文,__exit__() 在
語句體執行完後從運行時上下文退出。with 語句支持運行時上下文這一律念。
上下文表達式(Context Expression):with 語句中跟在關鍵字 with 以後的表達式,該表達式
要返回一個上下文管理器對象。
語句體(with-body):with 語句包裹起來的代碼塊,在執行語句體以前會調用上下文管
理器的 __enter__() 方法,執行完語句體以後會執行 __exit__() 方法。
with的用法:
with open('words.txt') as fp: while True: line = fp.readline() if line: print line.strip() else: break #咱們也能夠用with使用本身的方法 class A: def __enter__(self): print 'in enter' # 使用as獲取返回值 return self def __exit__(self, e_t, e_v, t_b): print 'in exit' def show(self): print 'initing....' with A() as a: print a.show() in enter initing in exit #用第三方庫來實現