標籤(空格分隔): python
with
做為一種上下文管理器
,在python
中的作用可以簡單的理解為是用來代替try...except...finally
的處理流程。
with
通過__enter__
方法初始化,然後在__exit__
中做善後以及處理異常。對於一些需要預先設定,事後要清理的一些任務,with
提供了一種非常方便的表達。在緊跟with
後面的語句被求值運算後,會呼叫運算返回物件的__enter__
方法,並將__enter__
的返回結果賦值給as
後面的變數。當with
後面的**塊全部被執行完之後,將呼叫返回物件的__exit__()
方法執行清理工作。
就像在檔案操作中:
file = open("file.txt")
try:
data = file.read()
finally:
file.close()
在使用了with...as...
後,**將精簡為:
with open("file.txt") as file:
data = file.read()
在上面的**中,open()
函式會返回乙個型別為file
的物件,該物件具有__enter__
與__exit__
方法(可以通過dir(file),type(file)
檢視),之後呼叫物件的__enter__
方法,將返回值賦值給file
變數,所以在使用with...as...
操作檔案時不需要顯示的關閉檔案。
既然知道with...as...
中最重要的就是__enter
、__exit__
,那我們就可以來自定義乙個上下文管理器。
其中:__enter__
方法將在進入**塊前被呼叫。
__exit__
將在離開**塊之後被呼叫(即使在**塊中遇到了異常)。
class withdemo:
def __enter__(self):
print "in __enter__"
return "withdemo"
def __exit__(self, type, value, trace):
print "in __exit__"
def get_demo_with():
return withdemo()
with get_demo_with() as demo:
print "demo:", demo
執行結果為:
in __enter__
demo:withdemo
in __exit__
在剛開始的時候就已經說,with..as..
可以用來代替try...except...finally...
的流程操作,上面都在說try...finally...
的情況,那異常呢?如果仔細點會發現__exit__()
的引數有三個,這三個引數便是為異常提供處理的引數。
class withdemo:
def __enter__(self):
return self
def __exit__(self, type, value, trace):
print "type:", type
print "value:", value
print "trace:", trace
def create_trace(self):
return (1/10) + 10
with withdemo() as demo:
demo.create_trace()
跑一下**就能發現**列印出了type, value, trace。 關於python中self的理解
self可以這麼理解 class就是表示 汽車 然後 init 是一些汽車的基本定義,比如要有發動機,要有方向盤 在這個定義的過程中,可能需要一種引用,比如現在北京要求汽車都要裝自檢測系統,監測系統統計資料必定是某一輛車它自身的,是乙個 例項 邦定的行為,你的檢測功能不會也不允許去收集其他汽車的資料...
關於最近學習python的理解
估計jupyter往空字典裡最多塞兩個key,表現可以由下面的 的輸出證明 dict1 dict1 print 請輸入你的姓名 num eval input 請輸入你的人數 for i in 0,num name input 請輸入你的姓名 score input 請輸入你的號數 dict1 nam...
關於python專案環境的理解
之前以為自己已經理解的各種環境,但是好像並不是,沒有深刻理解 開始學習程式設計的時候,各種環境配置完全不知道是什麼東西,更不知道是幹嘛用的,只是按著教程來操作。做完之後,可以還行,如果不行,便會抓瞎了。不知道改 不知道 出現了問題。很是疑惑和難受。後來慢慢知道path,host,setting,en...