關於python中with as 的使用

2021-08-20 11:25:39 字數 2597 閱讀 5734

其實with as是python的控制流語句,像if ,while等的,只是比那個難理解罷了

首先我先摘抄一段別人的**大體上給你們理解理解

首先請看下邊的解釋:

是不是不明白,其實我看了也覺得不明白,很暈,很繞,

下面給大家解釋一下,所謂上下文管理協議,其實是指with後面跟的ecception一般是乙個類的實體,這個類的實體要包含__enter____exit__函式的定義才行

這個類嗎 想必大家都知道了,還有try/finally  try/except等等這些異常處理方法我就不解釋了。我就直奔正題。對於__enter____exit__方法這兩個方法被稱為魔術方法

其實是python的內建函式

,那麼這兩個方法到底是怎麼用的那,我們來看乙個例子

class closer:

def __init(self,obj):

self.obj = obj

def __enter__(self):

return self.obj

def __exit__(sekf,exception_type,exception_val,trace)

try:

self.obj.close()

except attributeerror:

print "not closable"

return true

這是才定義乙個叫做closer的類,我們看一下這個類中有什麼

1. 乙個__init__方法,__init__方法是個魔術方法,就是內建方法,在類初始化物件的時候被執行,起到初始化的作用

2. 乙個__enter__方法,專門用於with  的乙個內建方法,他的返回值要跟with as 語句中跟在as 後邊的variable.

3. 乙個__exit__方法,用於with 語句的乙個內建方法當with as語句中的with-block被執行或者終止後,這個類的物件應該做什麼,如果這個**執行成功,則exception_type, exception_val。trace輸入值都是空,如果**出錯了,就會變成像try/exception/finally語句一樣

with exception as varable  

with-block

它的執行過程是:

首先執行exception裡面的__enter__函式,它的返回值會賦給as 後邊的variable。像讓他返回什麼就返回什麼,只要你知道怎麼處理就行了,如顆不寫as variable,返回值就會被忽略。然後,開始執行with-block中的語句,不論成功失敗(比如發生異常,錯誤,設定sys.exit()),在with-block執行完成後,會執行expection中的__exit__函式

然後可能有的同學會問,這又跟try/finally有什麼關係呢,其實這樣的過程等價與

try:

執行__enter__的內容

執行 with_block

finally:

執行__exit__內容

這就應該懂了吧 然後我們這時候再使用網上那些說的很迷的例子看一看  你就會明白了

class sample(object):             # object類是所有類最終都會繼承的類

def __enter__(self): # 類中函式第乙個引數始終是self,表示建立的例項本身

print("in __enter__()")

return "foo"

def __exit__(self, type, value, trace):

print("in __exit__()")

def get_sample():

return sample()

with get_sample() as sample:

print("sample:", sample)

然後我們看一下結果是不是和你想的是一樣的

in __enter__()

sample: foo

in __exit__()

我們然後來分析一下程式是怎麼執行的

python 中 with as的用法

with從python 2.5就有,需要from future import with statement。自python 2.6開始,成為預設關鍵字。在what s new in python2.6 3.0中,明確提到 the with statement is a control flow st...

Python中with as的用法

這個語法是用來代替傳統的try.finally語法的。with expression as variable with block 基本思想是with所求值的物件必須有乙個 enter 方法,乙個 exit 方法。緊跟with後面的語句被求值後,返回物件的 enter 方法被呼叫,這個方法的返回值將...

Python中的with as 語法

使用語言的好特性,而不是那些糟糕的特性 不知道誰說的 好久不學習python的語法了,上次去面試,和面試官聊到了python中的with as statement 也稱context manager 挺感興趣的,這兩天學習了一番,收穫頗豐在此分享。先說明乙個常見問題,檔案開啟 1 2 34 5 6 ...