>>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精品国产91久久久久久 | 日本黄色高清网站 | 成av在线 | 亚洲第一区第二区 | 久久99精品国产麻豆婷婷洗澡 | 亚洲欧美精品一区二区 | 国产综合精品久久亚洲 | 国产成人a亚洲精品 | 高清国语自产拍免费视频国产 | 国产亚洲女人久久久久久 | 欧美成人网在线综合视频 | 99爱在线精品视频免费观看9 | 国产精品国产成人国产三级 | 波多野结衣精品一区二区三区 | 九九视频在线看精品 | 国产xxxx搡xxxxx搡麻豆 | 99久久婷婷 | 色人阁网站 | 美国av片在线观看 | 天天操中文字幕 | 久久久一区二区 | 99久久精品免费观看区一 | 久草6| 久久伊人一区二区三区四区 | 一级香蕉免费毛片 | 538prom国产在线视频一区 | 日韩美女av在线 | 午夜精品久久久久久久星辰影院 | 尤物网站永久在线观看 | 国产精品啪一品二区三区粉嫩 | 国产小视频精品 | 91中文字幕在线一区 | 日韩欧美视频在线 | 国产淫语对白在线视频 | 一级毛片免费观看不收费 | 99国产精品视频免费观看 | 成人一区二区三区在线观看 |