上下文管理器(contextor)

2021-10-25 07:43:22 字數 3049 閱讀 9465

說明:

上下文管理器和迭代器很相似,實現了迭代協議函式的物件即為迭代器,實現了上下文協議函式物件即為上下文管理器。迭代器實現了__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...