例子一
class Foo(object): def __init__(self): print('实例化一个对象') def __enter__(self): print('进入') def __exit__(self, exc_type, exc_val, exc_tb): print('退出') obj = Foo() with obj: print('正在执行')
上面代码执行结果为:
实例化一个对象
进入
正在执行
退出
结论1
我们知道,实例化Foo,得到obj对象,会执行Foo的__init__方法,也就是打印了第一句;
按照,程序从上至下执行,应该会打印“正在执行”才对,为什么会在它之前先打印了进入,在它之后打印了退出呢?
因为我们在定义Foo时,定义了__enter__和__exit__方法,那么我们实例化的对象obj就是一个上下文管理器,
即含有__enter__和__exit__方法的对象就是上下文管理器。
上下文管理器最常用在需要类似管理文件,网络连接和锁这样的资源的程序中。这些资源的关键点在于它们必须显示地进行关闭或释放才能正确工作。例如,如果获得了一个锁,之后就必须确保要释放它,否者就会有死锁的风险。通过实现__enter__()和__exit__()方法,并且利用with语句来触发,这类问题就可以很容易的避免了。因为__exit__方法中的清理代码无论如何都会保证运行的。
with 上下文管理器:
语句体
当with遇到上下文管理器,就会在执行语句体之前,先执行上下文管理器的__enter__方法,然后再执行语句体,执行完语句体后,最后执行__exit__方法。
比如:
with open("/tmp/foo.txt") as file: data = file.read()
如果用try finally写的话:
somefile = open(r'somefileName') try: for line in somefile: print line # ...more code finally: somefile.close()