個人部落格
#注:enter方法可以寫連線資料庫的操作,exit方法寫斷開連線的操作,用with去管理
#注:with開啟的檔案物件,就是1個上下文管理器
#注:with語句可以去管理 上下文管理器物件
#注:使用with管理,上下文管理器 不需要自己呼叫 _enter _、_exit _方法
示例:上下文管理器
#上下文管理器 基本語法
# 1、普通方法開啟檔案物件
fp =
open
("test.txt"
,"a+"
)# a+ 追加寫
print
(dir
(fp)
)#結果為 [ …'__enter__', …, '__exit__'…]
#注:有__enter__、__exit__方法,是上下文管理器
fp.write(
"this is test"
)fp.close(
)#注:處理結束後,把它關掉,不然佔資源
# 2、用with語句執行
with
open
("test.txt"
,"a+"
)as f:
#注:賦給f物件
f.write(
"write test"
)#退出語句執行之後 with自動**物件
#因為開啟的檔案物件是上下文管理器
#注:open("test.txt","a+"):上下文表示式
with
open
("test.txt"
,"a+"):
print
("this is test"
)#注:不需要上下文管理器物件,可以這樣寫,沒有意義
#迭代器 有 __next__,__iter__方法
#上下文管理器
class
contextmanger()
:#注:定義1個上下文管理器的物件
def__init__
(self)
: self.entered =
false
def__enter__
(self)
:print
("__enter__ called"
) self.entered =
true
return self
def__exit__
(self, exc_type, exc_val, exc_tb)
:#注:exc_type, exc_val, exc_tb 異常型別、異常值、異常嘻嘻
#注:這3個引數不需要自己傳,with語句會幫忙管理。這3個引數接收異常資訊
print
("__exit__ called"
)print
(exc_type, exc_val, exc_tb)
self.entered =
false
cm01 = contextmanger(
)#注:建立例項物件
print
(cm01.entered)
# with contextmanger() as cm02: #注:可以這樣管理
with cm01:
#注:也可以這麼寫
print
(cm01.entered)
print
("this is test"
)#結果為
# false
# __enter__ called
# true
# this is test
# __exit__ called
# none none none #注:沒有異常就是none,不會報錯
#with語句會先執行__enter__方法,退出的時候自動執行__exit__方法
#正常退出的話,__exit__接受的三個引數都是none
#注:不改變**本身的工作,但又新增額外的功能
#注:上下文管理器 一般來說用作於清理資源、清理連線
# with語句執行的解析
# ·當with語句塊結束時,無論是正常結束,還是由於異常,都會呼叫上下文物件的__exit__()方法
# ·__exit__()方法有3個引數
# ·如果with語句正常結束,三個引數全部都是 none
示例:_exit _
#__exit__ 接受三個引數 異常類,異常值,回溯資訊
#上下文管理器 傳播異常 終止異常
class
myexception()
:def
__enter__
(self)
:return self
def__exit__
(self, exc_type, exc_val, exc_tb)
:if exc_val:
#注:如果有異常發生
print
(f"my exception: "
)# return false #注:傳播異常,給直譯器識別
return
true
#注:終止異常
with myexception():
#使用上下文管理器
print(1
+1)#注:沒有異常,輸出為2
with myexception():
print(1
/0)#注:false時 有異常
#false時 結果為 my exception: division by zero
#true時 結果為
# my exception: division by zero #注:true時 不報錯,程式不中斷
#注:true時 把異常傳遞出去,給直譯器知道
print
("end......"
)#注:return false 不會執行 end......
#注:return true 執行了 end......
#注:return true時,有點類似於異常捕獲機制 try...except...
#注:這個更nb,捕獲所有異常
#return true
#try:
# do_sth
#except:
# do_sth
示例:如果是valueerror異常,終止異常;如果不是,傳播異常
class
myexception()
:def
__enter__
(self)
:return self
def__exit__
(self, exc_type, exc_val, exc_tb):if
issubclass
(exc_type, valueerror)
:#注:如果是valueerror異常及子類異常
# if exc_type == valueerror: #注:exc_type是類,所以判斷條件valueerror類
return
true
#終止異常
return
false
#傳播異常
with myexception():
print(1
+1)raise valueerror(
"test value error"
)#注:issubclass(exc_type, valueerror) 如果是valueerror異常及子類異常
示例:contextlib實現上下文管理器
# contextlib實現上下文管理器
#不需要手寫class 實現上下文管理器
#使用contextlib模組
import contextlib
@contextlib.contextmanager
defmycontext()
:print
("enter context"
)yield
#注:生成器函式
print
("exit context"
)c1 = mycontext(
)print
(dir
(c1)
)#結果為 […'__enter__', '__exit__'…]
#注:使用裝飾器後 就是上下文管理器了。不使用裝飾器,只是生成器物件
with c1:
print
("*********x"
)#結果為
# enter context
# *********x
# exit context
#注:yield之前是它的__enter__方法,yield之後是它的__exit__方法
#注:這個方法不能終止異常,只能用try...except...進行異常捕獲
Python 學習筆記 上下文
python裡面有個特殊的模組叫做上下文模組,可以和with搭配來實現一些功能。他的執行方式是使用者需要乙個定義乙個生成器的函式 with後面跟這個函式,他會執行yield之前的 然後跳出來,執行with語句下面的 然後再切換回函式,執行finally後面的 比如import contextlib ...
Python筆記 上下文管理器
with 語句後面的結果物件,需要重寫 enter 和 exit 方法 當進入到 with 塊時,會自動呼叫 enter 方法裡的 當 with 塊執行完成以後,會自動呼叫 exit 方法 class demo object def enter self print enter 方法被執行了 ret...
python學習筆記 上下文管理器
上下文管理器可以在不需要檔案的時候,自動關閉檔案。下面我們看一下兩段程式 如下 without context manager f open new.txt w print f.closed whether the file is open f.write hello world f.close p...