with上下文管理

with上下文管理协议简介

python中的with是一种上下文管理协议,适用于那些进入和退出之后自动执行一些代码的场景以及对资源进行访问的场合,比如文件、网络连接、数据库连接或线程中锁的自动获取和释放等,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源。

with语句大概流程

with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常。

所以使用with处理的对象必须有__enter__()和__exit__()这两个方法。

其中__enter__()方法在语句体(with语句包裹起来的代码块)执行之前进入运行,__exit__()方法在语句体执行完毕退出后运行。

with语句的工作原理

在with后面的语句会被求值,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as关键字后面的变量,当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。

 with语句最关键的地方在于被求值对象必须有__enter__()和__exit__()这两个方法,那我们就可以通过自己实现这两方法来自定义with语句处理异常。

class A:
    def __enter__(self):
        print('进入with语句块时执行此方法,此方法如果有返回值会赋值给as声明的变量')
        return 'oo'

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出with代码块时执行此方法')
        print('1', exc_type)  # exc_type:错误的类型
        print('2', exc_val)  # exc_val:错误类型对应的值
        print('3', exc_tb)  # exc_tb:错误发生的位置

with A() as f:
    print('进入with语句块')
    # with语句中代码块出现异常,则with后的代码都无法执行。
    # raise AttributeError('sb')
    print(f) #f打印出oo
print('嘿嘿嘿')

执行结果如下:

 

posted @ 2022-04-29 15:12  _yessir  阅读(76)  评论(0)    收藏  举报