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

下載本文檔

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

文檔簡(jiǎn)介

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

f.write('程序日志:測(cè)試1\n')上下文管理器使用with語(yǔ)句打開(kāi)文件,把相關(guān)工作放在其下的語(yǔ)句塊中,當(dāng)語(yǔ)句塊結(jié)束的時(shí)候,會(huì)自動(dòng)完成清理工作,相當(dāng)于添加了一套finally子句。這就是上下文管理器。支持上下文管理的對(duì)象文件對(duì)象之所以能夠使用上下文管理器,是因?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('程序日志:測(cè)試1\n')#后續(xù)代碼...支持上下文管理的對(duì)象隱性調(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對(duì)象直接用減法運(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è)方法用于支持上下文管理器。支持上下文管理的對(duì)象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支持上下文管理的對(duì)象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對(duì)象相減,拋出ValueError異常

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論