26 python筆記 上下文管理器

2021-10-11 09:13:03 字數 4517 閱讀 2835

個人部落格

#注: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...