上下文管理協議

2021-08-18 08:38:54 字數 2787 閱讀 4120

class open:

def __init__(self,name):

self.name=name

def __enter__(self):

print('執行enter')

def __exit__(self, exc_type, exc_val, exc_tb):

print('執行exit')

with open('a.txt') as f:#with會呼叫__enter__函式

print('------')

print('******') #當**塊執行完畢後會呼叫__exit__函式

#輸出#執行enter

#------

#******

#執行exit

無錯誤情況
class foo:

def __init__(self,name):

self.name=name

def __enter__(self):

print('執行enter')

return self

def __exit__(self, exc_type, exc_val, exc_tb):

print('執行exit')

print(exc_type)

print(exc_val)

print(exc_tb)

with foo('a.txt') as f:#呼叫__enter__,相當於f=obj.__enter__()

print(f)

print(f.name)

print('------')

print('******')

#當**塊沒有錯誤時,執行完**塊後執行__exit__

print('這是最後一行')

#輸出'''

執行enter

<__main__.foo object at 0x00000218e75f3eb8>

a.txt

------

******

執行exit

none

none

none

這是最後一行

'''

**塊裡出現錯誤

class foo:

def __init__(self,name):

self.name=name

def __enter__(self):

print('執行enter')

return self

def __exit__(self, exc_type, exc_val, exc_tb):

print('執行exit')

print(exc_type)#輸出錯誤型別

print(exc_val) #輸出錯誤值

print(exc_tb) #輸出錯誤追蹤資訊

with foo('a.txt') as f:#呼叫__enter__,相當於f=obj.__enter__()

print(f)

print(f.name)

print(a) #這裡出錯會立即執行__exit__,列印出錯誤,程式會立即終止,下面的**將不會執行

print('------')

print('******')

print('這是最後一行')

#輸出'''

執行enter

<__main__.foo object at 0x00000202edfb3eb8>

a.txt

執行exit

name 'a' is not defined

traceback (most recent call last):

file "e:/python3.6/three.py", line 16, in print(a)

nameerror: name 'a' is not defined

'''

出現錯誤讓程式繼續執行
class foo:

def __init__(self,name):

self.name=name

def __enter__(self):

print('執行enter')

return self

def __exit__(self, exc_type, exc_val, exc_tb):

print('執行exit')

print(exc_type)#輸出錯誤型別

print(exc_val) #輸出錯誤值

print(exc_tb) #輸出錯誤追蹤資訊

return true #返回true讓程式繼續執行

with foo('a.txt') as f:#呼叫__enter__,相當於f=obj.__enter__()

print(f)

print(f.name)

print(a) #這裡出錯會立即執行__exit__,列印出錯誤,**塊下的將不會執行,而是直接跳出**塊繼續往下執行

print('------')

print('******')

print('這是最後一行')

#輸出'''

執行enter

<__main__.foo object at 0x000001c9211ea198>

a.txt

執行exit

name 'a' is not defined

這是最後一行

'''

上下文協議管理

with obj as f 塊 1.with obj 觸發obj.enter 拿到返回值 2.as f f 返回值 3.with obj as f 等同於 f obj.enter 4.執行 塊 一 沒有異常的情況下,整個 塊執行完畢後去觸發 exit 它的三個引數都為none 二 有異常的情況下,從...

上下文管理協議

with open a.txt as f 開啟檔案,並自動關閉檔案 pass 上下文管理協議 class open def init self,name self.name name def enter self print 執行enter print self return self def ex...

python 上下文管理協議

class open def init self,name self.name name def enter self print 出現with語句,物件的 enter 被觸發,有返回值則賦值給as宣告的變數 return self def exit self,exc type,exc val,ex...