上下文管理器

2021-10-14 15:12:52 字數 2414 閱讀 8612

今天我們聊聊上下文管理器,當然今天所談僅為個人觀點!!!

今天如果不是學生面試回來跟我聊到了上下文管理器,我都忘了python中還有這麼個鬼了。特別寫一篇博文我們簡單聊聊。

普通的檔案操作方式,例如:

# 情況01

# 1、以寫的方式開啟檔案

f =open

("1.txt"

,"w"

)# 2、寫入檔案內容

f.write(

"hello world"

)# 3、關閉檔案

f.close(

)# 情況02

# 1、以讀的方式開啟檔案

f =open

("1.txt"

,"r"

)# 2、讀取檔案內容

f.write(

"hello world"

)# 3、關閉檔案

f.close(

)

問題情況說明:

當遇到以上情況02時,檔案操作過程中程式奔潰了,會導致後面關閉檔案的**無法正常執行,因而會導致已經開啟的檔案無法正常關閉。而開啟的檔案物件會占用作業系統的資源,並且作業系統同一時間能開啟的檔案數量也是有限的,而大量出現這種情況會造成伺服器出現明顯的記憶體洩漏現象;

當大量的檔案處於開啟狀態,無法正常關閉的情況下,會占用大量的作業系統的資源,必然會造成大量的記憶體資源浪費,當達到一定量值之後,會導致伺服器出現記憶體溢位現象,即:當我們要執行新程式的時候由於記憶體空間不足,相關程式無法正常啟動的情況。

python提供了 with 語句的這種寫法,既簡單又安全,並且 with 語句執行完成以後自動呼叫關閉檔案操作,即使出現異常也會自動呼叫關閉檔案操作

例如:

# 1、以寫的方式開啟檔案 

with

open

("test.txt"

,"w"

)as f:

# 2、讀取檔案內容

f.write(

"hello world"

)

python 提供了 with 語句用於簡化資源釋放的操作,使用 with 語句操作檔案即可,實現這種操作的前提是建立在上下文管理器的基礎上,即實現__enter__和__exit__方法

重點:

with語句之所以這麼強大,背後是由上下文管理器做支撐的,也就是說剛才使用 open 函式建立的檔案物件就是就是乙個上下文管理器物件

上下文管理器構造原理:

乙個類只要實現了__enter__()和__exit__()這個兩個方法,通過該類建立的物件我們就稱之為上下文管理器物件。

使用**定義乙個上下文管理類例項:

class

file

(object):

# 初始化方法

def__init__

(self, file_name, file_model)

:# 定義變數儲存檔名和開啟模式

self.file_name = file_name

self.file_model = file_model

# 上文方法

def__enter__

(self)

:print

("進入上文方法"

)# 返回檔案資源

self.

file

=open

(self.file_name,self.file_model)

return self.

file

# 下文方法

def__exit__

(self, exc_type, exc_val, exc_tb)

:print

("進入下文方法"

) self.

file

.close(

)if __name__ ==

'__main__'

:# 使用with管理檔案

with file(

"1.txt"

,"r")as

file

: file_data =

file

.read(

)print

(file_data)

上下文管理器的應用場景:
資源管理功能,即檔案、網路連線、資料庫連線等操作時需要關閉資源。

也可以在**執行前後增加功能,類似於裝飾器,比如**之前做許可權驗證等。

時間關係今天就寫到這吧,打卡回家。

with上下文管理器

在執行 with 語句時,首先執行 with 後面的 open 執行完 後,會將 的結果通過 as 儲存到 f 中 然後在下面實現真正要執行的操作 在操作後面,並不需要寫檔案的關閉操作,檔案會在使用完後自動關閉 實際上,在檔案操作時,並不是不需要寫檔案的關閉,而是檔案的關閉操作在 with 的上下文...

with上下文管理器

上下文管理器 任何實現了enter 和exit 法的物件都可稱之為上下 管理 器,上下 管理器物件可以使 with 關鍵字。顯然,件 file 物件也實現 了上下 管理器 方法一class file def init self,filename,mode self.filename filename...

python 上下文管理器

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