今天我們聊聊上下文管理器,當然今天所談僅為個人觀點!!!
今天如果不是學生面試回來跟我聊到了上下文管理器,我都忘了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...