上下文管理課件_第1頁
上下文管理課件_第2頁
上下文管理課件_第3頁
上下文管理課件_第4頁
上下文管理課件_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

《Python開發(fā)技術(shù)應(yīng)用》61上下文管理上下文管理器上下文管理器,是一個(gè)包裝其他代碼的對象,用于處理那些事先需要設(shè)置,事后需要做清理工作的事務(wù)。使用上下文管理器最多的場景是文件對象。在使用文件對象時(shí),最簡陋的做法是這樣的:f=open("/tmp/test.txt")f.write('程序日志:測試1\n') #假設(shè)這就是要做的全部工作f.close()上下文管理器如果忘記調(diào)用file.close()方法,會(huì)存在兩個(gè)問題:如果在程序運(yùn)行結(jié)束之前發(fā)生藍(lán)屏、斷電等情況,已經(jīng)寫入但暫未緩沖的數(shù)據(jù)會(huì)丟失。在程序運(yùn)行結(jié)束之前,打開的文件會(huì)被占用,其他程序或用戶將無法修改、移動(dòng)或刪除這個(gè)文件?,F(xiàn)在給這些代碼加上finally語句:f=open("/tmp/test.txt")try:f.write('程序日志:測試1\n') #假設(shè)這就是要做的全部工作finally:f.close()這段代碼可以改寫為:withopen("/tmp/foo.txt")asf:

f.write('程序日志:測試1\n')上下文管理器使用with語句打開文件,把相關(guān)工作放在其下的語句塊中,當(dāng)語句塊結(jié)束的時(shí)候,會(huì)自動(dòng)完成清理工作,相當(dāng)于添加了一套finally子句。這就是上下文管理器。支持上下文管理的對象文件對象之所以能夠使用上下文管理器,是因?yàn)槲募愋蛯?shí)現(xiàn)了__enter__()和__exit__()兩個(gè)特殊的方法。其中__enter__()是在進(jìn)入上下文管理器的時(shí)候自動(dòng)調(diào)用,__exit__()是在退出上下文管理器時(shí)自動(dòng)調(diào)用。withopen("/tmp/foo.txt")asf:

f.write('程序日志:測試1\n')#后續(xù)代碼...支持上下文管理的對象隱性調(diào)用了f.__enter__()隱性調(diào)用了f.__exit__()案例:設(shè)計(jì)一個(gè)代表平面坐標(biāo)點(diǎn)的類Point,支持上下文管理為了方便計(jì)算平面坐標(biāo)距離,設(shè)計(jì)一個(gè)Point類,其功能如下:要求實(shí)現(xiàn)運(yùn)算符重載(魔術(shù))方法__sub__(),用于兩個(gè)Point對象直接用減法運(yùn)算符(-)進(jìn)行運(yùn)算,得到坐標(biāo)間的距離;要求實(shí)現(xiàn)__str__()方法,用于在print()函數(shù)進(jìn)行打印時(shí)顯示坐標(biāo)值;要求實(shí)現(xiàn)__enter__()和__exit__()兩個(gè)方法用于支持上下文管理器。支持上下文管理的對象A(4,5)AxAyYXOByBxB(-3,3)|AB|...A=Point(4,5)B=Point(-3,3)distance=A-B#要求Point類支持減法print(distance)執(zhí)行結(jié)果:7.280109889280518支持上下文管理的對象123456789101112131415161718192021222324252627classPoint:def__init__(self,x,y):self.x,self.y=x,ydef__sub__(self,other):#實(shí)現(xiàn)此方法可以支持減法運(yùn)算

ifother.__class__==self.__class__:return((self.x-other.x)**2+(self.y-other.y)**2)**0.5else:#如果不是同類型的Point對象相減,拋出ValueError異常

raiseTypeError("incorrectcoordinateparametertype")def__str__(self):returnf"Point({self.x},{self.y})"def__enter__(self):#此方法在進(jìn)入with語句時(shí)自動(dòng)調(diào)用

print(f'{self.y}進(jìn)入上下文管理器')

returnself#必須將當(dāng)前對象返回給上下文管理器

def__exit__(self,exc_type,exc_val,exc_tb):#此方法在離開with語句時(shí)自動(dòng)調(diào)用

print(f'{self.y}離開上下文管理器,完成清理工作')A=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論