對於系統資源如檔案、資料庫連線、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 的形參。執行的時候由...