python 上下文管理協議

2021-08-28 03:48:05 字數 3607 閱讀 8799

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