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, exc_tb):
print('with中**塊執行完畢時執行我啊')
#相當於例項化的過程 f=open()
# init 會在with 這一行之前觸發
with open('a.txt') as f:#with 裡面 執行異常時候回直接觸發exit **塊
print('*****>執行**塊')
# print(asdsad)#不存在的變數
print("*****>>>")
print("00000000")# exit 在檔案中執行完後去執行
# 我們知道在操作檔案物件的時候可以這麼寫
# with open('a.txt') as f:
# 2 '**塊'
# 上述叫做上下文管理協議,即with語句,為了讓乙個物件相容with語句,必須在這個物件的類中宣告__enter__和__exit__方法
## 複製**
## 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, exc_tb):
# print('with中**塊執行完畢時執行我啊')
# with open('a.txt') as f:
# print('*****>執行**塊')
# # print(f,f.name)
# 複製**
## __exit__()
# 中的三個引數分別代表異常型別,異常值和追溯資訊, with語句中**塊出現異常,則with後的**都無法執行
## 複製**##
# class open:
# def __init__(self, name):
# self.name = name
## def __enter__(self):
# print('出現with語句,物件的__enter__被觸發,有返回值則賦值給as宣告的變數')
## def __exit__(self, exc_type, exc_val, exc_tb):
# print('with中**塊執行完畢時執行我啊')
# print(exc_type)
# print(exc_val)
# print(exc_tb)##
# with open('a.txt') as f:
# print('*****>執行**塊')
# raise attributeerror('***著火啦,救火啊***')
# print('0' * 100) # ------------------------------->不會執行
# 複製**
# 如果__exit()
# 返回值為true, 那麼異常會被清空,就好像啥都沒發生一樣,with後的語句正常執行
## 複製**##
# class open:
# def __init__(self, name):
# self.name = name
## def __enter__(self):
# print('出現with語句,物件的__enter__被觸發,有返回值則賦值給as宣告的變數')
## def __exit__(self, exc_type, exc_val, exc_tb):
# print('with中**塊執行完畢時執行我啊')
# print(exc_type)
# print(exc_val)
# print(exc_tb)
# return true##
# with open('a.txt') as f:
# print('*****>執行**塊')
# raise attributeerror('***著火啦,救火啊***')
# print('0' * 100) # ------------------------------->會執行
# 複製**
## 複製**##
class open:
def __init__(self, filepath, mode='r', encoding='utf-8'):
self.filepath = filepath
self.mode = mode
self.encoding = encoding
def __enter__(self):
# print('enter')
self.f = open(self.filepath, mode=self.mode, encoding=self.encoding)
return self.f
def __exit__(self, exc_type, exc_val, exc_tb):
# print('exit')
self.f.close()
return true # return true 時就會把異常吃掉 意味著with 語句結束了
def __getattr__(self, item):
return getattr(self.f, item)
with open('a.txt', 'w') as f:
print(f)
f.write('aaaaaa')
f.wasdf # 丟擲異常,交給__exit__處理
#執行**塊
#在沒有異常的情況下,整個**塊執行完畢後去觸發__exit__,他的三個引數都為none
# 有異常的情況下,從異常出現的位置直接觸發__exit__
# 如果 __exit__為true 代表吞掉了異常
# 如果 __exit__不為true 代表吐出了異常
# exit 的執行完畢就代表了整個with 語句的執行完畢
# 用途或者說好處:
## 使用with語句的目的就是把**塊放入with中執行,with結束後,自動完成清理工作,無須手動干預
## 在需要管理一些資源比如檔案,網路連線和鎖的程式設計環境中,可以在__exit__中定製自動釋放資源的機制,你無須再去關係這個問題,這將大有用處
上下文管理協議
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...
上下文協議管理
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...