- 实例化Foo,得到对象a,执行__init__方法,打印第一句;如下:
在定义Foo时,定义了__enter__和__exit__方法,那么我们实例化的对象obj就是一个上下文管理器,
即含有__enter__和__exit__方法的对象就是上下文管理器。
所以在这里可以用with
with 上下文管理器:
语句体
当with遇到上下文管理器时,执行顺序:先执行上下文管理器的__enter__方法 -> 再执行语句体 -> 最后执行__exit__方法.
举例如下:
- with调用上下文管理器的 __enter__ 方法时;如果使用了 as 子句,则将 __enter__() 方法的返回值赋值给 as 子句中的目标对象,即下面as后面的obj;
obj可以是单个变量或()括起来的元组; __enter__ 方法无返回左下图,有返回右下图,举例如下:
《《《--》》》
- 下面是我用with 加 上下文管理器连接数据库的例子如下:
常见的上下文管理的用法:
with open("/tmp/foo.txt") as file:
data = file.read()
如果使用传统的 try/finally 范式,则要使用类似如下代码:
somefile = open(r'somefileName')
try:
for line in somefile:
print line
finally:
somefile.close()
- 结论
使用 with 语句可以减少编码量;不管在处理对象过程中是否发生异常,都能保证 with 语句执行完毕后,关闭了打开对象