<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      Fork me on GitHub

      Python深入02 上下文管理器

      作者:Vamei 出處:http://www.rzrgm.cn/vamei 歡迎轉(zhuǎn)載,也請(qǐng)保留這段聲明。謝謝!

       

      上下文管理器(context manager)是Python2.5開始支持的一種語法,用于規(guī)定某個(gè)對(duì)象的使用范圍。一旦進(jìn)入或者離開該使用范圍,會(huì)有特殊操作被調(diào)用 (比如為對(duì)象分配或者釋放內(nèi)存)。它的語法形式是with...as...

       

      關(guān)閉文件

      我們會(huì)進(jìn)行這樣的操作:打開文件,讀寫,關(guān)閉文件。程序員經(jīng)常會(huì)忘記關(guān)閉文件。上下文管理器可以在不需要文件的時(shí)候,自動(dòng)關(guān)閉文件

      下面我們看一下兩段程序:

      # without context manager
      f = open("new.txt", "w") print(f.closed)               # whether the file is open
      f.write(
      "Hello World!") f.close()
      print(f.closed)

      以及:

      # with context manager
      with open("new.txt", "w") as f:
      print(f.closed) f.write(
      "Hello World!")

      print(f.closed)

      兩段程序?qū)嶋H上執(zhí)行的是相同的操作。我們的第二段程序就使用了上下文管理器 (with...as...)。上下文管理器有隸屬于它的程序塊。當(dāng)隸屬的程序塊執(zhí)行結(jié)束的時(shí)候(也就是不再縮進(jìn)),上下文管理器自動(dòng)關(guān)閉了文件 (我們通過f.closed來查詢文件是否關(guān)閉)。我們相當(dāng)于使用縮進(jìn)規(guī)定了文件對(duì)象f的使用范圍

       

      上面的上下文管理器基于f對(duì)象的__exit__()特殊方法(還記得我們?nèi)绾卫锰厥夥椒▉韺?shí)現(xiàn)各種語法?參看特殊方法與多范式)。當(dāng)我們使用上下文管理器的語法時(shí),我們實(shí)際上要求Python在進(jìn)入程序塊之前調(diào)用對(duì)象的__enter__()方法,在結(jié)束程序塊的時(shí)候調(diào)用__exit__()方法。對(duì)于文件對(duì)象f來說,它定義了__enter__()和__exit__()方法(可以通過dir(f)看到)。在f的__exit__()方法中,有self.close()語句。所以在使用上下文管理器時(shí),我們就不用明文關(guān)閉f文件了。

       

      自定義

      任何定義了__enter__()和__exit__()方法的對(duì)象都可以用于上下文管理器。文件對(duì)象f是內(nèi)置對(duì)象,所以f自動(dòng)帶有這兩個(gè)特殊方法,不需要自定義。

      下面,我們自定義用于上下文管理器的對(duì)象,就是下面的myvow:

       

      # customized object
      
      class VOW(object):
          def __init__(self, text):
              self.text = text
          def __enter__(self):
              self.text = "I say: " + self.text    # add prefix
              return self                          # note: return an object
          def __exit__(self,exc_type,exc_value,traceback):
              self.text = self.text + "!"          # add suffix
      
      
      with VOW("I'm fine") as myvow:
          print(myvow.text)
      
      print(myvow.text)

       

      我們的運(yùn)行結(jié)果如下:

      I say: I'm fine
      I say: I'm fine!

      我們可以看到,在進(jìn)入上下文和離開上下文時(shí),對(duì)象的text屬性發(fā)生了改變(最初的text屬性是"I'm fine")。

      __enter__()返回一個(gè)對(duì)象。上下文管理器會(huì)使用這一對(duì)象作為as所指的變量,也就是myvow。在__enter__()中,我們?yōu)閙yvow.text增加了前綴 ("I say: ")。在__exit__()中,我們?yōu)閙yvow.text增加了后綴("!")。

      注意: __exit__()中有四個(gè)參數(shù)。當(dāng)程序塊中出現(xiàn)異常(exception),__exit__()的參數(shù)exc_type, exc_value, traceback用于描述異常。我們可以根據(jù)這三個(gè)參數(shù)進(jìn)行相應(yīng)的處理。如果正常運(yùn)行結(jié)束,這三個(gè)參數(shù)都是None。在我們的程序中,我們并沒有用到這一特性。

       

      總結(jié):

      通過上下文管理器,我們控制對(duì)象在程序不同區(qū)間的特性。上下文管理器(with EXPR as VAR)大致相當(dāng)于如下流程:

      # with EXPR as VAR:
      
      VAR = EXPR
      VAR = VAR.__enter__()
      try:
          BLOCK
      finally:
          VAR.__exit__()

      由于上下文管理器帶來的便利,它是一個(gè)值得使用的工具。

       

      posted @ 2012-11-23 15:41  Vamei  閱讀(42982)  評(píng)論(11)    收藏  舉報(bào)
      主站蜘蛛池模板: 吉林市| 色综合天天综合网国产人| 国产精品视频一区不卡| 中文字幕av日韩有码| 在线a亚洲老鸭窝天堂| 在线高清免费不卡全码| 国产欧美日韩亚洲一区二区三区 | 97视频精品全国免费观看| 亚洲精品久久一区二区三区四区| 无码日韩av一区二区三区 | 99精品国产在热久久无| 中文字幕亚洲一区二区三区| 男女吃奶做爰猛烈紧视频| 亚洲国产码专区在线观看| 亚洲av综合色一区二区| 亚洲精品国产精品国在线| 邮箱| 国产成人一区二区三区视频免费 | 精品一区二区三区四区色| 精品国产肉丝袜在线拍国语| 国产仑乱无码内谢| 国产精品无遮挡猛进猛出| 亚洲av鲁丝一区二区三区黄| 精品无码人妻一区二区三区| 翘臀少妇被扒开屁股日出水爆乳| 日韩乱码人妻无码中文字幕视频| 成年女人片免费视频播放A| 亚洲熟妇无码另类久久久| 国产精品视频不卡一区二区| 宫西光有码视频中文字幕| 色综合AV综合无码综合网站| 亚洲 日本 欧洲 欧美 视频| аⅴ天堂中文在线网| 久久国产免费观看精品| 最新国产精品中文字幕| 日本在线a一区视频高清视频| 亚洲V天堂V手机在线| 人妻少妇乱子伦精品| 亚洲国产综合性亚洲综合性| 一区二区亚洲人妻精品| 中文字幕在线亚洲精品|