Swift51.com
麦子学院 头像
麦子学院  2018-04-22 22:06

Python学习之上下文管理器详解

回复:0  查看:2665  
本文和大家分享的是python 中上下文管理器相关内容,上下文管理器主要用于规定某个对象的使用范围,下面将详细围绕上下文管理器使用方法、实现机制等方面展开介绍,一起来看看吧,希望对大家 学习python有所帮助。
   为什么需要上下文管理器?
  首先,需要思索下为什么需要引入上下文管理器。
  在正常情况下,管理各种系统资源(如文件)、数据库连接时,通常是先打开这些资源,执行完相应的业务逻辑,最后关闭资源。
  举两个例子:
  1.  使用 Python 打开一个文件写入内容,之后需要关闭这个文件。如果不正常关闭的话可能会在文件操作时出现异常,因为系统允许你打开的文件的最大数是有限的。
  2.  在数据库连接时也是存在类似问题,数据库的连接算是一种比较昂贵的资源,若连接过多而没有及时关闭的话,就可能出现不能继续连接的异常错误。
  但是,很多程序员经常会忘记关闭文件,或者关闭数据库的连接。这时候就引入了  上下文管理器  ,它可以在你不需要该对象的时候,自动关闭它。
   上下文管理器怎么使用?
  上下文管理器的语法是:with...as...
   实例:文件操作
   print " 不使用上下文管理器 " print "*" * 30 f =  open('file.py', 'w') print  f.closed f. write("# Hello World") f. close() print  f.closed
   print "\n 使用上下文管理器 " print "*" * 30
  with  open("file.py", 'w')  as  f:
   print  f.closed
   f. write('# Hello Python') print  f.closed
  这里通过.closed 比较,我们可以看到上下文管理器可以自动关闭文件,对于上下文管理器而言,有隶属于它的程序块,当隶属于它的程序块执行结束的时候(判断缩进),上下文管理器将自动关闭文件。
  上述实例,也可以使用try...except... 来实现,同样可以很直观的看到使用 with...as... 语句之后,代码确实相对更加简洁。
   上下文管理实现机制
  因为文件对象是Python 的内置对象,内置了上下文管理的特殊方法,所以它可以使用 with 语句。在 Python 中,任何对象,只要实现了上下文管理,就可以使用 with 语句,实现上下文管理需要通过 __enter__ __exit__ 这两个方法来实现。
  关于这两个方法:
  ·  enter (self) :进入该对象时调用此方法,返回值将放入 with...as... 语句中的 as 说明的变量中
  ·  exit (self, type, value, tb): 离开上下文管理器时调用该方法,如果有异常出现,返回 False type value tb 将分别表示异常的类型、值和追踪信息,传递出上下文显示;如果没有异常,则三个变量的值均为 None
   with  上下文管理器:
  语法体
  当with 语句遇到上下文管理器时,就会在执行语法体之前,先执行 __enter__ 方法,然后再执行语法体,执行完语法体之后,执行 __exit__ 方法。
   上下文管理器实现
  使用Python2.7X 实现一个上下文管理器 :
   class  Context(object):
   def  __init__(self):
   print " 实例化一个对象 "
   def  __enter__(self):
   print " 获取该对象 "
   def  __exit__(self, exc_type, exc_val, exc_tb):
   print " 退出该对象 "
  temp = Context()
   with temp:
   print " 执行体 "
  这样,__enter__ 方法和 __exit__ 方法的调用过程就很明晰。
  contextLib
  在contextlib 中,提供了 contextmanager 装饰器,通过 yield 返回函数将函数分隔为两部分, yield 之前的语句在 __enter__ 中执行, yield 之后的语句在 __exit__ 中执行,简化了上下文管理器的实现方式:
总结:通过上下文管理器,我们可以更好的控制对象在不同区间的特性,并且可以使用with 语句替代 try...except 方法,使得代码更加的简洁,主要的使用场景是访问资源,可以保证不管过程中是否发生错误或者异常都会执行相应的清理操作,释放出访问的资源。
来源:网络