最近看到有 「with」 關鍵字的語句,它通常用在什麼場景呢?我們在操作對於一些檔案的開啟、資料庫連線、socket等等,應用程式開啟這些資源並執行完業務邏輯之後,必須做的一件事就是要關閉(斷開)該資源,否則資源將會被占用。本篇將介紹with和上下文管理器的簡單應用,還有乙個資料庫的小應用。
來看看如何正確關閉乙個檔案。
defm1
(): f=
open("
output.txt",
"w")
f.write("
python之禪")
f.close
()但是開啟檔案和檔案的讀寫是有風險的,可能會出現ioerror異常,這樣會導致檔案的f.close()不會被呼叫,因此資源就得不到釋放。
這時就引出了try......finally。
入門:
defm2
(): f=
open("
output.txt",
"w")
try: f
.write("
python之禪")
except
ioerror:
print("
sorry error")
finally: f
.close
()使用try來捕捉異常,如果沒有讀到檔案出現異常跳到except中繼續執行,不關讀沒讀到檔案,最終都會執行finally,關閉檔案。
雖然關閉檔案得到了解決,但是每次開啟檔案太過於繁瑣,接下來介紹一種方法with。
初學:
defm3
():
with
open("
try.txt",
"r")
asf:
content=f
.read
()一種更加簡潔、優雅的方式就是用 with 關鍵字
。open 方法的返回值賦值給變數 f,當離開 with **塊的時候,系統會自動呼叫 f.close() 方法, with 的作用和使用 try/finally 語句是一樣的。那麼它的實現原理是什麼?在講 with 的原理前要涉及到另外乙個概念,就是上下文管理器(context manager)。
任何實現了__enter__和__exit__()方法的物件都可稱之為上下文管理器
,上下文管理器物件可以使用 with 關鍵字。顯然,檔案(file)物件也實現了上下文管理器。
那麼檔案物件是如何實現這兩個方法的呢?我們可以模擬實現乙個自己的檔案類,讓該類實現 __enter__() 和 __exit__() 方法。
classwithopen_file
():
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
,exc_type
,exc_val
,exc_tb
):
print("
will exit")
self.f
.close()
open_file("
try.txt",
"r")
asf:
with_body
執行結果:
enter
will exit
hello world
大致對with語句的執行原理總結python上下文管理器與with語句
:from
pymysql
import*
classdb(
object):
def__init__
(self
,databasename
,password)
# 1、連線資料
# 建立connection
self
.conn
=connect
(host='
localhost',
port
=3306
,database
=str
(databasename
),user='
root',
password
=str
(password
),charset='
utf8')
# 獲取cursor物件
self
.csl
=self
.conn
.curser()
def__enter__
(self):
return
self
.csl;
def__exit__
(self
,exc_type
,exc_val
,exc_tb):
self
.csl
.close()
self
.conn
.close()
withdb(
"jing_dong",
"mysql")
asdb
: db
.execute("
select * from goods_brands; ")
content=db
.fetchall()
(content
)總結就不寫了。。。。。。。。。
python的with檔案操作與上下文
帶有 with 關鍵字的語句,它通常用在對於系統資源如檔案 資料庫連線 socket而言,應用程式開啟這些資源並執行完業務邏輯之後,必須做的一件事就是要關閉 斷開 該資源。比如 python 程式開啟乙個檔案,往檔案中寫內容,寫完之後,就要關閉該檔案,否則會出現什麼情況呢?極端情況下會出現 too ...
python中 python中的 與
這一部分首先要理解python記憶體機制,python中萬物皆物件。對於不可變物件,改變了原來的值,其別名 變數名 繫結到了新值上面,id肯定會改變 對於可變物件,操作改變了值,id肯定會變,而 是本地操作,其值原地修改 對於 號操作,可變物件和不可變物件呼叫的都是 add 操作 對於 號操作,可變...
淺淡python中with的用法,上下文管理器
首先來看一段 class foo object def init self print 例項化乙個物件 def enter self print 進入 def exit self,exc type,exc val,exc tb print 退出 obj foo with obj print 正在執行...