Python2.5以后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围。本文是针对于该功能的思考总结。程序员
首先,须要思索下为何须要引入上下文管理器。
在正常状况下,管理各类系统资源(如文件)、数据库链接时,一般是先打开这些资源,执行完相应的业务逻辑,最后关闭资源。
举两个例子:数据库
可是,不少程序员常常会忘记关闭文件,或者关闭数据库的链接。这时候就引入了上下文管理器,它能够在你不须要该对象的时候,自动关闭它。函数
上下文管理器的语法是:with...as...code
实例:文件操做对象
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__这两个方法来实现。
关于这两个方法:博客
with 上下文管理器: 语法体
当with语句遇到上下文管理器时,就会在执行语法体以前,先执行__enter__方法,而后再执行语法体,执行完语法体以后,执行__exit__方法。it
使用Python2.7X实现一个上下文管理器:class
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方法,使得代码更加的简洁,主要的使用场景是访问资源,能够保证无论过程当中是否发生错误或者异常都会执行相应的清理操做,释放出访问的资源。
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成转载需注明出处,且在文章页面明显位置给出原文连接。