其實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 ...