python 上下文管理器實現

2021-09-25 23:38:03 字數 2087 閱讀 6169

上下文管理器實現需要有__enter__()和__exit__()的特殊方法

enter(self): 進入上下文管理器時呼叫此方法,其返回值將被放入with-as語句中as說明符指定的變數中。

exit(self,type,value,tb):離開上下文管理器呼叫此方法。如果有異常出現,type、value、tb分別為異常的型別、值和追蹤資訊。如果沒有異常,3個引數均設為none。此方法返回值為true或者false,分別指示被引發的異常得到了還是沒有得到處理。如果返回false,引發的異常會被傳遞出上下文。

對於系統資源,如檔案、套接字、資料庫連線等,應用程式開啟這些檔案並執行相應的操作之後,必須關閉。否則消耗資源會導致程式崩潰。

實現方式一:

class

file

(object):

def__init__

(self,filename,mode)

: self.filename = filename

self.mode = mode

def__enter__

(self)

:print

("--enter--"

) self.f =

open

(self.filename,self.mode)

return self.f

def__exit__

(self,

*args)

:print

("--exit---"

) self.f.close(

)with file(

"out.txt"

,"w"

)as f:

f.write(

"hello world"

)

輸出結果:

–enter–

–exit—

實現方式二 yield方法

from contextlib import contextmanger

@contextmanger

deffile

(path,mode)

: f =

open

(path,mode)

yield f

f.close(

)with file(

"out.txt"

,"w"

)as f:

f.write(

"hello world hahah"

)

例項:計算函式執行的時間,使用上下文管理器實現。

import time

class

printtime

(object):

def__enter__

(self)

: self.t0 = time.time(

)def

__exit__

(self,

*args)

:print

("[time:s]"

.format

(time = time.time(

)-self.t0)

)def

func

(number)

: li =[1

,2,4

]if number <4:

return li[number -1]

else

:if number >3:

return func(number -1)

+ func(number -2)

+ func(number -3)

if __name__ ==

"__main__"

:with printtime(

)as t:

func(4)

time.sleep(1)

print

("do things"

)

輸出結果:

do things

[time:1.00s]

python 上下文管理器

上下文管理器允許你在有需要的時候,精確地分配和釋放資源。使用上下文管理器最廣泛的案例就是with語句了。想象下你有兩個需要結對執行的相關操作,然後還要在它們中間放置一段 上下文管理器就是專門讓你做這種事情的。舉個例子 with open some file w as opened file open...

python上下文管理器

上下文管理器是乙個包裝任意 塊的物件。上下文管理器保證進入上下文管理器時,每次 執行的一致性 當退出上下文管理器時,相關資源會被正確 這裡被正確 指的是在 exit 方法自定義 比如關閉資料庫游標 值得注意的是,上下文管理器一定能夠保證退出步驟的執行。如果進入上下文管理器,根據定義,一定會有退出步驟...

Python 上下文管理器

python中的上下文管理器是乙個包裝任意 塊的物件。它在處理資源的開啟關閉 異常的處理等方面有很好的實現方法。1.上下文管理器的語法 假設我們需要讀取乙個檔案中的資料,如下 try test file open test.txt r contents test file.read finally ...