真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python教程:with語句的用法

一 、with語句的原理

上下文管理協(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í)行過程是這樣的:

  • 執(zhí)行EXPR,生成上下文管理器context_manager;
  • 獲取上下文管理器的__exit()__方法,并保存起來用于之后的調(diào)用;
  • 調(diào)用上下文管理器的__enter__()方法;如果使用了as子句,則將__enter__()方法的返回值賦值給as子句中的VAR;
  • 執(zhí)行BLOCK中的表達式;
  • 不管是否執(zhí)行過程中是否發(fā)生了異常,執(zhí)行上下文管理器的__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);
  • 出現(xiàn)異常時,如果__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

'''

三、總結(jié)

自定義上下文管理器來對軟件系統(tǒng)中的資源進行管理,比如數(shù)據(jù)庫連接、共享資源的訪問控制等。


分享標(biāo)題:Python教程:with語句的用法
文章路徑:http://weahome.cn/article/dsogihs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部