上下文管理器with语句
如果一个类对象实现了特殊方法__enter__()
和__exit__()
,那么就称这个类对象遵守了上下文管理协议,同时,这个类对象的实例对象被称为上下文管理器。with
语句会让上下文管理器创建一个运行时上下文,当进入运行时上下文时自动调用特殊方法__enter__()
,当离开运行时向下文时自动调用特殊方法__exit__()
。
with语句的语法格式:
with 上下文表达式 [as 变量]:
with 语句体
如果with
语句体中产生了异常,那么sys.exc_info()
的返回值中的三个元素会被自动传递给特殊方法__exit__()
的形参exc_type
、exc_val
、exc_tb
,这三个形参分别表示异常的类型、异常的错误信息和异常调用堆栈的跟踪信息。
与finally
类似,特殊方法__exit__()
总会被调用,通常在特殊方法__exit__()
中释放资源,例如:关闭文件、关闭网路连接等。
#!/usr/bin/python3
class MyContextManager(object):
def __enter__(self):
print('特殊方法__enter__()被调用')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('特殊方法__exit__()被调用')
print('异常的类型:%s' % exc_type)
print('异常的错误信息:%s' % exc_val)
print('异常调用堆栈的跟踪信息:%s' % exc_tb)
# return True
def do_sth(self):
print('方法do_sth()被调用')
print(1 / 0)
"""
with MyContextManager() as mcm:
mcm.do_sth()
"""
try:
with MyContextManager() as mcm:
mcm.do_sth()
except ZeroDivisionError as err:
print(err)
[root@lyucan ~]# ./yc.py
特殊方法__enter__()被调用
方法do_sth()被调用
特殊方法__exit__()被调用
异常的类型:<class 'ZeroDivisionError'>
异常的错误信息:division by zero
异常调用堆栈的跟踪信息:<traceback object at 0x7fb5a99c4b88>
division by zero
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com