python 關於with的理解

2021-10-08 11:50:53 字數 2191 閱讀 2255

標籤(空格分隔): 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...