說明:
上下文管理器和迭代器很相似,實現了迭代協議函式的物件即為迭代器,實現了上下文協議函式物件即為上下文管理器。迭代器實現了__iter__和__next__方法。而上下文管理器則是__enter__和__exit__方法。
class contexto(object):
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
pass
contexto=contexto()
說明:
contexto實現了__enter__和__exit__上下管理器協議,當例項化物件的時候則建立了上下文管理器contexto。
class contexto(object):
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
contexto=contexto()
with contexto as var :
print(var)
說明:
配合with語句的時候,上下文管理器會自動呼叫__enter__,然後進入上下文執行時環境,如果有as語句,返回自身或另乙個與執行時上下文相關的物件
,值賦值給var。當後面的語句執行完畢,或者發生異常,就會進入__exit__方法內
,並且會把對於異常的引數傳過來,如果__exit__方法返回的是true,則with語句塊不會顯示丟擲異常,終止程式,如果返回none或者false,異常會被主動raise,並終止程式。
為什麼要用上下文管理器?
可以以一種更加優雅的方式,操作(建立/獲取/釋放)資源,如檔案操作、資料庫連線;可以以一種更加優雅的方式,處理異常;
說明:
處理異常,通常都是使用try...execept..
來捕獲處理的。這樣做乙個不好的地方是,在**的主邏輯裡,會有大量的異常處理**,這會很大的影響我們的可讀性。
class contexto(object):
def __enter__(self):
print()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
return true
def opens(self):
a=1+''
print(a)
contexto=contexto()
with contexto as var :
var.opens()
說明:
異常可以在__exit__
進行捕獲並由你自己決定如何處理,是丟擲呢還是在這裡就解決了。在__exit__
裡返回true
(沒有return 就預設為 return false),就相當於告訴 python直譯器,這個異常我們已經捕獲了,不需要再往外拋了。
在 寫__exit__
函式時,需要注意的事,它必須要有這三個引數:
當主邏輯**沒有報異常時,這三個引數將都為none。
上下管理器工具
import contextlib
@contextlib.contextmanager
def contexts(file_name):
print('首先進入我__enter__')
file_one=open(file_name,'r')
yield file_one #yield 之前為__enter__ yield 之後為__exit__
print('然後進入我__exit__')
file_one.close()
with contexts('yu.txt') as f:
for i in f:
print(i)
說明:
這段**並不能實現異常處理,需要處理異常還是需要try...excetp...finally
import contextlib
@contextlib.contextmanager
def contexts(file_name):
print('首先進入我__enter__')
file_one=open(file_name,'r')
try:
yield file_one
except (valueerror,exception) as f :
print(f)
finally:
file_one.close()
return
with contexts('yu.txt') as f:
for i in f:
i/0 #錯誤
print(i) #首先進入我__enter__
unsupported operand type(s) for /: 'str' and 'int'
總結:上下文管理工具重點在於yield ,在之前為__enter__,之後如為__exit__。在管理工具中管理資源可以這樣,但是在處理異常的時候還是需要try...excetp...finally語句來實現。 with上下文管理器
在執行 with 語句時,首先執行 with 後面的 open 執行完 後,會將 的結果通過 as 儲存到 f 中 然後在下面實現真正要執行的操作 在操作後面,並不需要寫檔案的關閉操作,檔案會在使用完後自動關閉 實際上,在檔案操作時,並不是不需要寫檔案的關閉,而是檔案的關閉操作在 with 的上下文...
with上下文管理器
上下文管理器 任何實現了enter 和exit 法的物件都可稱之為上下 管理 器,上下 管理器物件可以使 with 關鍵字。顯然,件 file 物件也實現 了上下 管理器 方法一class file def init self,filename,mode self.filename filename...
上下文管理器
今天我們聊聊上下文管理器,當然今天所談僅為個人觀點!今天如果不是學生面試回來跟我聊到了上下文管理器,我都忘了python中還有這麼個鬼了。特別寫一篇博文我們簡單聊聊。普通的檔案操作方式,例如 情況01 1 以寫的方式開啟檔案 f open 1.txt w 2 寫入檔案內容 f.write hello...