Python-上下文管理器with语句

  1. 上下文管理器with语句

上下文管理器with语句

如果一个类对象实现了特殊方法__enter__()__exit__(),那么就称这个类对象遵守了上下文管理协议,同时,这个类对象的实例对象被称为上下文管理器。
with语句会让上下文管理器创建一个运行时上下文,当进入运行时上下文时自动调用特殊方法__enter__(),当离开运行时向下文时自动调用特殊方法__exit__()

with语句的语法格式:

with 上下文表达式 [as 变量]:
    with 语句体

如果with语句体中产生了异常,那么sys.exc_info()的返回值中的三个元素会被自动传递给特殊方法__exit__()的形参exc_typeexc_valexc_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