上下文管理協(xié)議(Context Management Protocol):包含方法 __enter__()
和__exit__()
,支持該協(xié)議的對象要實現(xiàn)這兩個方法。
創(chuàng)新互聯(lián)公司堅信:善待客戶,將會成為終身客戶。我們能堅持多年,是因為我們一直可值得信賴。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。十載網(wǎng)站建設(shè)經(jīng)驗創(chuàng)新互聯(lián)公司是成都老牌網(wǎng)站營銷服務(wù)商,為您提供網(wǎng)站制作、成都網(wǎng)站設(shè)計、網(wǎng)站設(shè)計、H5開發(fā)、網(wǎng)站制作、品牌網(wǎng)站制作、成都小程序開發(fā)服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。
上下文管理器(Context Manager):支持上下文管理協(xié)議的對象,這種對象實現(xiàn)了__enter__()
和__exit__()
方法。上下文管理器定義執(zhí)行with語句時要建立的運行時上下文,負責(zé)執(zhí)行with語句塊上下文中的進入與退出操作。通常使用with語句調(diào)用上下文管理器,也可以通過直接調(diào)用其方法來使用。
說完上面兩個概念,我們再從with語句的常用表達式入手,一段基本的with表達式,其結(jié)構(gòu)是這樣的:
with EXPR as VAR:
BLOCK
其中EXPR可以是任意表達式;as VAR是可選的。其一般的執(zhí)行過程是這樣的:
__exit()__
方法,并保存起來用于之后的調(diào)用;__enter__()
方法;如果使用了as子句,則將__enter__()
方法的返回值賦值給as子句中的VAR;__exit__(
)方法,__exit__()
方法負責(zé)執(zhí)行“清理”工作,如釋放資源等。如果執(zhí)行過程中沒有出現(xiàn)異常,或者語句體中執(zhí)行了語句break/continue/return,則以None作為參數(shù)調(diào)用__exit__(None, None, None)
;如果執(zhí)行過程中出現(xiàn)異常,則使用sys.exc_info得到的異常信息為參數(shù)調(diào)用__exit__(exc_type, exc_value, exc_traceback)
;__exit__(type, value, traceback)
返回False,則會重新拋出異常,讓with之外的語句邏輯來處理異常,這也是通用做法;如果返回True,則忽略異常,不再對異常進行處理。Python的with語句是提供一個有效的機制,讓代碼更簡練,同時在異常產(chǎn)生時,清理工作更簡單。
class DBManager(object):
def __init__(self):
pass
def __enter__(self):
print('__enter__')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
return True
def getInstance():
return DBManager()
with getInstance() as dbManagerIns:
print('with demo')
with后面必須跟一個上下文管理器,如果使用了as,則是把上下文管理器的 __enter__()
方法的返回值賦值給 target,target 可以是單個變量,或者由“()”括起來的元組(不能是僅僅由“,”分隔的變量列表,必須加“()”)
代碼運行結(jié)果如下:
'''
__enter__
with demo
__exit__
'''
結(jié)果分析:當(dāng)我們使用with的時候,__enter__
方法被調(diào)用,并且將返回值賦值給as后面的變量,并且在退出with的時候自動執(zhí)行__exit__
方法
'''
學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流群:
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書!
'''
class With_work(object):
def __enter__(self):
"""進入with語句的時候被調(diào)用"""
print('enter called')
return "xxt"
def __exit__(self, exc_type, exc_val, exc_tb):
"""離開with的時候被with調(diào)用"""
print('exit called')
with With_work() as f:
print(f)
print('hello with')
'''
enter called
xxt
hello with
exit called
'''
自定義上下文管理器來對軟件系統(tǒng)中的資源進行管理,比如數(shù)據(jù)庫連接、共享資源的訪問控制等。