詳解python中的with關鍵字

2021-09-26 08:04:24 字數 2197 閱讀 5665

對於系統資源如檔案、資料庫連線、socket 而言,應用程式開啟這些資源並執行完業務邏輯之後,必須做的一件事就是要關閉(斷開)該資源。

如何正確的關閉乙個檔案呢?

1.普通版

def

test0()

: f =

open

("1.txt"

,"w"

) f.write(

"0000"

) f.close(

)

2.高階版

def

test1()

: f =

open

("1.txt"

,"w"

)try

: f.write(

"111111"

)except exception:

print

("error"

)finally

: f.close(

)

3.高階版

def

test2()

:with

open

("1.txt"

,"w"

)as f:

f.write(

"2222"

)

使用with關鍵字的方法更為簡潔,它的實現原理是什麼,這就涉及到上下文管理器。

任何實現了__enter__()__exit__()方法的物件都可稱之為上下文管理器

4.用類還原with的實現原理

class

test4

(object):

def__init__

(self, file_name, mode)

: self.file_name = file_name

self.mode = mode

def__enter__

(self)

: self.f =

open

(self.file_name, self.mode)

return self.f

def__exit__

(self,

*args)

: self.f.close(

)with test4(

"1.txt"

,"w"

)as f:

f.write(

"4444"

)"""

首先test4("1.txt", "w")初始化例項物件,

然後with會尋找類中是否有__enter__ 和 __exit__,

如果有則呼叫__enter__函式,

最後__enter__() 方法返回資源物件,這裡就是你將要開啟

的那個檔案物件,__exit__() 方法處理一些清除工作。

"""

5.使用contextmanager裝飾器,實現with功能

from contextlib import contextmanager

"""python 還提供了乙個 contextmanager 的裝飾器,更進一步簡化

了上下文管理器的實現方式。通過 yield 將函式分割成兩部分,yield 之前的

語句在 __enter__ 方法中執行,yield 之後的語句在 __exit__ 方法中執行。

緊跟在 yield 後面的值是函式的返回值。

"""@contextmanager

deftest5

(path, mode)

: f =

open

(path, mode)

yield f

f.close(

)with test5(

'out.txt'

,'w'

)as f:

f.write(

"5555"

)

總結:

python 提供了 with 語法用於簡化資源操作的後續清除操作,是 try/finally 的替代方法,實現原理建立在上下文管理器之上。此外,python 還提供了乙個 contextmanager 裝飾器,更進一步簡化上下管理器的實現方式。

Python基礎 Python中的命名和關鍵字

注 如果你對python感興趣,我這有個學習python基地,裡面有很多學習資料,感興趣的 q群 688244617 1.python中的關鍵字 false none true and as assert break class continue def del elif else except f...

python 中type和object的關係

學習python的同學都知道這麼幾句話 那麼type和object是什麼關係呢?object是乙個新式類,我們可以通過object.class 和object.bases 來獲取object所屬的類核他的父類。object.class 這說明 object類是乙個type元類的例項。這與type是所...

詳解 python 詳解python中 的用法

python中 的用法 是乙個裝飾器,針對函式,起呼叫傳參的作用。有修飾和被修飾的區別,function作為乙個裝飾器,用來修飾緊跟著的函式 可以是另乙個裝飾器,也可以是函式定義 結果1it s funa分析1 funa 修飾函式定義def func 將func 賦值給funa 的形參。執行的時候由...