>>len(src)20>>>fp<_io.TextIOWrapperna" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python中的上下文管理器和with語句塊

系統(tǒng) 1925 0

上下文管理器對(duì)象存在的目的就是管理with語句。上下文管理器協(xié)議包含__enter__ 和__exit__ 兩個(gè)方法。with 語句開始運(yùn)行時(shí),會(huì)在上下文管理器對(duì)象上調(diào)用__enter__ 方法。with 語句運(yùn)行結(jié)束后,會(huì)在上下文管理器對(duì)象上調(diào)用__exit__ 方法

來看一個(gè)例子,把文件對(duì)象當(dāng)成上下文管理器使用

            
              
                with
              
              
                open
              
              
                (
              
              
                'test.dat'
              
              
                )
              
              
                as
              
               fp
              
                :
              
              
    secc 
              
                =
              
               fp
              
                .
              
              read
              
                (
              
              
                20
              
              
                )
              
              
                >>
              
              
                >
              
              
                len
              
              
                (
              
              src
              
                )
              
              
                20
              
              
                >>
              
              
                >
              
               fp 

              
                <
              
              _io
              
                .
              
              TextIOWrapper name
              
                =
              
              
                'mirror.py'
              
               mode
              
                =
              
              
                'r'
              
               encoding
              
                =
              
              
                'UTF-8'
              
              
                >
              
              
                >>
              
              
                >
              
               fp
              
                .
              
              closed
              
                ,
              
               fp
              
                .
              
              encoding 

              
                (
              
              
                True
              
              
                ,
              
              
                'UTF-8'
              
              
                )
              
              
                """
但是不能在fp 上執(zhí)行I/O 操作,因?yàn)樵趙ith 塊的末尾,調(diào)用TextIOWrapper.__exit__
方法把文件關(guān)閉了。
"""
              
              
                >>
              
              
                >
              
               fp
              
                .
              
              read
              
                (
              
              
                60
              
              
                )
              
              
Traceback 
              
                (
              
              most recent call last
              
                )
              
              
                :
              
              
File 
              
                "
                
                  "
                
              
              
                ,
              
               line 
              
                1
              
              
                ,
              
              
                in
              
              
                <
              
              module
              
                >
              
              
ValueError
              
                :
              
               I
              
                /
              
              O operation on closed 
              
                file
              
              
                .
              
            
          

執(zhí)行with后面的表達(dá)式得到的結(jié)果是上下文管理器對(duì)象,不過,把值綁定到目標(biāo)變量上(as子句)是上下文管理器調(diào)用__enter__方法的結(jié)果

來看一個(gè)例子,自己實(shí)現(xiàn)一個(gè)上下文管理器

            
              
                class
              
              
                Sample
              
              
                (
              
              
                )
              
              
                :
              
              
                def
              
              
                __enter__
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                "in __enter__"
              
              
                )
              
              
                return
              
               self
        
    
              
                def
              
              
                __exit__
              
              
                (
              
              self
              
                ,
              
               exc_type
              
                ,
              
               exc_val
              
                ,
              
               exc_tb
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                "in __exit__"
              
              
                )
              
              
                def
              
              
                do_something
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                "i am doing something"
              
              
                )
              
              
                >>
              
              
                >
              
              
                with
              
               Sample
              
                (
              
              
                )
              
              
                as
              
               sample
              
                :
              
              
        sample
              
                .
              
              do_something
              
                (
              
              
                )
              
              
                in
              
               __enter__
i am doing something

              
                in
              
               __exit__

            
          

真?zhèn)€過程運(yùn)行如下,enter()方法被執(zhí)行,enter()方法返回值,在這里是類自身,執(zhí)行代碼塊sample.do_something(), 最后是exit()方法被調(diào)用

contextlib模塊中的使用工具

@contextmanager 裝飾器能減少創(chuàng)建上下文管理器的樣板代碼量,因?yàn)椴挥镁帉懸粋€(gè)完整的類,定義__enter__ 和__exit__方法,而只需實(shí)現(xiàn)有一個(gè)yield 語句的生成器,生成想讓__enter__ 方法返回的值。
在使用@contextmanager 裝飾的生成器中,yield語句的作用是把函數(shù)的定義體分成兩部分**:yield 語句前面的所有代碼在with 塊開始時(shí)(即解釋器調(diào)用__enter__方法時(shí))執(zhí)行,yield 語句后面的代碼在with 塊結(jié)束時(shí)(即調(diào)用__exit__ 方法時(shí))執(zhí)行**

看一個(gè)使用contextmanager實(shí)現(xiàn)上下文管理器的例子

            
              
                import
              
               contextlib
@contextlib
              
                .
              
              contextmanager

              
                def
              
              
                Sample
              
              
                (
              
              
                )
              
              
                :
              
              
                def
              
              
                do_something
              
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                'i am doing something'
              
              
                )
              
              
                print
              
              
                (
              
              
                "in __enter__"
              
              
                )
              
              
                yield
              
               do_something
    
              
                print
              
              
                (
              
              
                "in exit"
              
              
                )
              
              
                >>
              
              
                >
              
              
                with
              
               Sample
              
                (
              
              
                )
              
              
                as
              
               sample
              
                :
              
              
        sample
              
                (
              
              
                )
              
              
                in
              
               __enter__
i am doing something

              
                in
              
               __exit__

            
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 免费久久一级欧美特大黄 | 久久久久久久99精品免费观看 | 日韩中文一区二区三区 | 久草视频精品 | 欧美日韩一区二区三区自拍 | 91国内精品久久久久免费影院 | 国产欧美日韩在线 | 免费又色又爽1000禁片 | 日韩影视在线 | 久久久中文字幕 | 久久精品一区二区三区不卡牛牛 | 亚洲成人动漫在线观看 | 可以免费看黄色 | 国产99久久久国产精品 | 日韩欧美在线一区二区三区 | 国产一区二区三区在线 | 久久夜视频 | 精品AV一区二区三区久久 | 国产精品人妻无码久久久郑州 | 免费日韩av | 99成人免费视频 | 亚洲三级视频 | 日韩亚洲一区二区三区 | 黄色视频a级毛片 | 在线激情视频 | 亚洲入口 | 男生插女生视频免费 | 久久国产精品区 | 拍拍拍无挡免费视频网站 | 成人高清在线 | 欧美日韩一区二区不卡 | 香蕉草草久在视频在线播放 | 人人综合网 | 蜜芽在线 | 成人在线免费av | 国产亚洲精品日韩香蕉网 | 亚洲精品久久一区二区三区四区 | 久久综合一个色综合网 | 日韩精品区 | 色影影院 | 日韩三极 |