欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中@contextmanager裝飾器的用法詳解

 更新時(shí)間:2023年07月21日 09:24:45   作者:發(fā)條宇  
這篇文章主要介紹了python中@contextmanager裝飾器的用法詳解,@contextmanager 的作用就是我們可以把一個(gè)非自定義類改成一個(gè)上下文管理器,需要的朋友可以參考下

@contextmanager 的作用就是我們可以把一個(gè)非自定義類改成一個(gè)上下文管理器。

這個(gè)會(huì)經(jīng)常遇到,所以有必要理解一下。

上下文管理器 是有 enter__和__exit ,那么我們可以為需要改寫的普通類創(chuàng)建一個(gè)子類,在其中添加上__enter__和__exit__方法通過(guò)繼承父類的方式實(shí)現(xiàn)上下文管理器。

但是通過(guò)contextlib模塊下提供的@contextmanager裝飾器,我們能夠更方便的將一個(gè)普通類變成上下文管理器。

@contextmanager通過(guò)將一個(gè)函數(shù)變成生成器的方式來(lái)為普通類添加進(jìn)入和退出時(shí)的處理代碼,從而實(shí)現(xiàn)了將普通類變成一個(gè)上下文管理器。

還是拿文件來(lái)舉個(gè)例子 # 結(jié)果 打開文件 查詢文件 關(guān)閉文件

from contextlib import contextmanager
class File():
    def query(self):
        print('查詢文件')
@contextmanager
def open():
    print('打開文件')
    yield File()
    print('關(guān)閉文件')
with open() as f:
    f.query()

執(zhí)行的順序:

①with語(yǔ)句調(diào)用open函數(shù)=>②執(zhí)行open中yield之前的代碼(打開文件)=>③執(zhí)行yield語(yǔ)句中的代碼(File())=>④執(zhí)行with語(yǔ)句中的代碼(f.query)=>⑤執(zhí)行yiled語(yǔ)句后的代碼(關(guān)閉文件)

注意:

  • 此時(shí)的with語(yǔ)句后是調(diào)用被修飾的函數(shù),而不是實(shí)例化上下文管理器對(duì)象
  • with open() as f 中的f是yield語(yǔ)句中的內(nèi)容,上述示例中即所創(chuàng)建的File對(duì)象
  • yield前、中、后的代碼都可以省略不寫

栗子2:

from contextlib import contextmanager
class DataBase():
    def query(self):
        print('寫入操作')
    @contextmanager
    def open(self):
        try:
            yield
            self.commit()
        except Exception as e:
            self.rollback()
            raise e
db = DataBase()
with db.open():
    db.query()

重點(diǎn)理解執(zhí)行順序 ①with語(yǔ)句調(diào)用open函數(shù)=>②執(zhí)行try異常判斷=>③執(zhí)行with語(yǔ)句中的寫入操作=>④執(zhí)行數(shù)據(jù)庫(kù)的提交操作=>⑤如果出現(xiàn)異常執(zhí)行數(shù)據(jù)庫(kù)回滾操作

小結(jié):

1.在思考過(guò)程中我們可以假設(shè)with語(yǔ)句中的內(nèi)容整體移到了yield語(yǔ)句后,從而將with語(yǔ)句的執(zhí)行簡(jiǎn)化為@contextmanager所修飾的函數(shù)的執(zhí)行

2.當(dāng)我們需要在一段代碼的執(zhí)行前后加上其他的處理代碼時(shí)都可以使用@contextmanager來(lái)完成,并不需要一定是對(duì)上下文管理器的操作

到此這篇關(guān)于python中@contextmanager裝飾器的用法詳解的文章就介紹到這了,更多相關(guān)python的@contextmanager裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python入門之基礎(chǔ)語(yǔ)法詳解

    Python入門之基礎(chǔ)語(yǔ)法詳解

    這篇文章主要介紹了Python入門之基礎(chǔ)語(yǔ)法詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很大的幫助喲,需要的朋友可以參考下
    2021-05-05
  • python+requests接口壓力測(cè)試500次,查看響應(yīng)時(shí)間的實(shí)例

    python+requests接口壓力測(cè)試500次,查看響應(yīng)時(shí)間的實(shí)例

    這篇文章主要介紹了python+requests接口壓力測(cè)試500次,查看響應(yīng)時(shí)間的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Django rest framework工具包簡(jiǎn)單用法示例

    Django rest framework工具包簡(jiǎn)單用法示例

    這篇文章主要介紹了Django rest framework工具包簡(jiǎn)單用法,結(jié)合匿名訪問(wèn)控制的具體實(shí)例分析了Django rest framework工具包的注冊(cè)、路由設(shè)置、視圖、權(quán)限控制、配置等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Python獲取秒級(jí)時(shí)間戳與毫秒級(jí)時(shí)間戳的示例代碼

    Python獲取秒級(jí)時(shí)間戳與毫秒級(jí)時(shí)間戳的示例代碼

    這篇文章主要介紹了Python獲取秒級(jí)時(shí)間戳與毫秒級(jí)時(shí)間戳的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python批量上傳文件信息到服務(wù)器的實(shí)現(xiàn)示例

    Python批量上傳文件信息到服務(wù)器的實(shí)現(xiàn)示例

    在進(jìn)行軟件測(cè)試的過(guò)程中,經(jīng)常會(huì)需要準(zhǔn)備一批數(shù)據(jù),本文主要介紹了Python批量上傳文件信息到服務(wù)器的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 打包PyQt5應(yīng)用時(shí)的注意事項(xiàng)

    打包PyQt5應(yīng)用時(shí)的注意事項(xiàng)

    這篇文章主要介紹了打包PyQt5應(yīng)用時(shí)的注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2020-02-02
  • Python定義二叉樹及4種遍歷方法實(shí)例詳解

    Python定義二叉樹及4種遍歷方法實(shí)例詳解

    這篇文章主要介紹了Python定義二叉樹及4種遍歷方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了二叉樹的概念、原理,以及Python定義與遍歷二叉樹相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Python中ArcPy柵格裁剪柵格(批量對(duì)齊柵格圖像范圍并統(tǒng)一行數(shù)與列數(shù))

    Python中ArcPy柵格裁剪柵格(批量對(duì)齊柵格圖像范圍并統(tǒng)一行數(shù)與列數(shù))

    本文介紹基于Python中ArcPy模塊,實(shí)現(xiàn)基于柵格圖像批量裁剪柵格圖像,同時(shí)對(duì)齊各個(gè)柵格圖像的空間范圍,統(tǒng)一其各自行數(shù)與列數(shù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Python3指定路徑尋找符合匹配模式文件

    Python3指定路徑尋找符合匹配模式文件

    這篇文章主要介紹了Python3指定路徑尋找符合匹配模式文件,涉及Python文件查找與模式匹配的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐

    Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐

    本文主要介紹了Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論