淺淡python中with的用法,上下文管理器

2021-09-07 16:25:17 字數 3310 閱讀 9503

首先來看一段**:

class

foo(object):

def__init__

(self):

print('

例項化乙個物件')

def__enter__

(self):

print('進入'

)def

__exit__

(self, exc_type, exc_val, exc_tb):

print('退出'

)obj =foo()

with obj:

print('

正在執行

')

上面**執行結果為:

例項化乙個物件

進入正在執行

退出

我們知道,例項化foo,得到obj物件,會執行foo的__init__方法,也就是列印了第一句;

按照,程式從上至下執行,應該會列印「正在執行」才對,為什麼會在它之前先列印了進入,在它之後列印了退出呢?

因為我們在定義foo時,定義了__enter__和__exit__方法,那麼我們例項化的物件obj就是乙個上下文管理器,

含有__enter__和__exit__方法的物件就是上下文管理器。

with 上下文管理器:

語句體

當with遇到上下文管理器,就會在執行語句體之前,先執行上下文管理器的__enter__方法,然後再執行語句體,執行完語句體後,最後執行__exit__方法

這也就是為什麼會出現文章開頭的情況的原因。

再看看這段**:

class

foo(object):

def__init__

(self):

print('

例項化乙個物件')

def__enter__

(self):

print('進入'

)def

__exit__

(self, exc_type, exc_val, exc_tb):

print('退出'

)# return true

obj =foo()

with obj:

raise

importerror

print('

正在執行

')

結果如下:

把上面**中我們注釋掉的那一行**取消注釋,結果如下

我們會發現,雖然我們故意在語句體中丟擲乙個錯誤,按照正常情況,執行到報錯地方就不會執行了,而__exit__是在語句體執行完之後執行的,但還是執行了__exit__方法;當我們在__exit__中給乙個返回值為ture時,就會忽略錯誤。

所有我們可以發現

with語句類似

try :

except:

finally:

的功能:但是with語句更簡潔。而且更安全。**量更少。

出現異常時,如果 __exit__ 返回 false(預設不寫返回值時,即為false),則會重新丟擲異常,讓with 之外的語句邏輯來處理異常,這也是通用做法;如果返回 true,則忽略異常,不再對異常進行處理

class

foo(object):

def__init__

(self):

print('

例項化乙個物件')

def__enter__

(self):

print('進入'

)

#return self

def__exit__

(self, exc_type, exc_val, exc_tb):

print('退出'

)with foo() as obj:

print

(obj,type(obj))

print('

正在執行

把上面**中我們注釋掉的那一行**取消注釋,結果如下

呼叫上下文管理器的 __enter__ 方法時;如果使用了 as 子句,則將 __enter__() 方法的返回值賦值給 as 子句中的目標

with 上下文管理器  as  target:

**語句體

with後面必須跟乙個上下文管理器,如果使用了as,則是把上下文管理器的 __enter__() 方法的返回值賦值給 target,target 可以是單個變數,或者由「()」括起來的元組(不能是僅僅由「,」分隔的變數列表,必須加「()」)我們經常會看到這樣的**:

with open("

/tmp/foo.txt

") as file:

data = file.read()

這裡使用了 with 語句,不管在處理檔案過程中是否發生異常,都能保證 with 語句執行完畢後已經關閉了開啟的檔案控制代碼。如果使用傳統的 try/finally 正規化,則要使用類似如下**:

somefile = open(r'

somefilename')

try:

for line in

somefile:

print

line

#...more code

finally

: somefile.close()

比較起來,使用 with 語句可以減少編碼量。已經加入對上下文管理協議支援的還有模組 threading、decimal 等。

with只能配合上下文管理器使用,常見的上下文管理器有

file

decimal.context

thread.locktype

threading.lock

threading.rlock

threading.condition

threading.semaphore

threading.boundedsemaphore

淺淡python中with的用法,上下文管理器

首先來看一段 class foo object def init self print 例項化乙個物件 def enter self print 進入 def exit self,exc type,exc val,exc tb print 退出 obj foo with obj print 正在執行...

iOS中淺淡UIApplication單例

當進行有關該應用的相關操作設定時需要獲取,進行響應的操作。比如 1 應用之間的呼叫和跳轉 openurl nsurl urlwithstring nsstring stringwithformat tel personphonestr openurl nsurl urlwithstring 開啟簡訊...

iOS中淺淡UIApplication單例

當進行有關該應用的相關操作設定時需要獲取,進行響應的操作。比如 1 應用之間的呼叫和跳轉 openurl nsurl urlwithstring nsstring stringwithformat tel personphonestr openurl nsurl urlwithstring 開啟簡訊...