Python深入02上下文管理器

  

  (上下文管理器)是Python2.5开始支持的一种语法,用于规定   ,一旦进入或者离开该使用范围,会有特殊操作被调用(比如为对象分配或者释放内存)。它的语法形式是   

  

  

  

  .

  

  

           <前>      
        ,            (f.closed),,,,,,,      
f.write (               (f.closed)         

  

     <前>      
        ,            (f.closed)   ,,f.write (         )   
  (f.closed)   

  )。上下文管理器有   。当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件(我们通过   来查询文件是否关闭)。我们相当于使用   规定了文件对f的象   .

     

  特殊方法(还记得我们如何利用特殊方法来实现各种语法?参看   特殊方法与多范式)。当我们使用上下文管理器的语法时,我们实际上要求Python在进入程序块之前调用对象的   方法,在结束程序块的时候调用   方法。对于文件对象f来说,它定义了__enter__()和__exit__()方法(可以通过   看的到)。在f的__exit__()方法中,有   ,所以在使用上下文管理器时,我们就不用明文关闭f文件了。

  

  

  

  定义了__enter__()和__exit__()方法的对象都可以用于上下文管理器。文件对象f是内置对象,所以f自动带有这两个特殊方法,不需要自定义。

  

  

           
 #, customized  objectclass 誓言(对象):,,,,def  __init__(自我,文本):
  ,,,,,,,self.text =, text ,,, def  __enter__(自我):
  ,,,,,,,self.text =,“小姐:说:,“,+,self.text ,,, #, add 前缀
  ,,,,,,,return  self ,,,,,,,,,,,,,,,,,,,,,,,,, #,注意:return  an 对象
  ,,,def  __exit__(自我、exc_type exc_value回溯):
  ,,,,,,,self.text =, self.text  +,“!“,,,,,,,,,, #, add  suffixwith 誓言(“我# 39;m  fine"), as  myvow:,,,,打印(myvow.text)打印(myvow.text) 
        

  

     <>以前小姐:说:,我# 39;m 好   小姐:说:,我# 39;m 好!   

  

  

  所指的变量,也就是myvow。在__enter__()中,我们为myvow。文本增加了前缀(“我说:“)。在__exit__()中,我们为myvow.text增加了后缀(“!“)。

  

  (例外),   中   ,   ,   用于描述异常。我们可以根据这三个参数进行相应的处理。如果正常运行结束,这三个参数都是   。在我们的程序中,我们并没有用到这一特性。

  

总结:

  

通过上下文管理器,我们控制对象在程序不同区间的特性。上下文管理器(   )大致相当于如下流程:

           
 #, with  EXPR  as  VAR: VAR =EXPR
  时间=VAR  VAR.__enter__()尝试:
  ,,,BLOCKfinally:
  ,,,VAR.__exit__ () 
        

由于上下文管理器带来的便利,它是一个值得使用的工具。

  http://shenzhen.offcn.com/

Python深入02上下文管理器