python-with 上下文管理

一、什么是上下文管理器

  1、如果一个类中实现了__enter__ 和__exit__方法 ,那么这个类就可以当作一个上下文管理器的类 。

  2、这个类的对象即可以称之为上下文管理器 (可以通过with 去执行调用)

  3、主要作用:用于资源的获取和释放,如文件操作,数据库连接,处理异常

 

with 语法:

  表达式:

  with object as var

    block

  上下文管理器: object  (一个实现了 __enter__ 和__exit__方法 的类) ---object()实例化这个类的对象

  上下文管理器返回的资源对象:var

  上下文管理中其他要执行的语句块:block

 

二、代码例子

 

class MyContextManager():

    def __enter__(self):
        print('访问资源')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('**********关闭资源**********')

    def otherFunc(self):
        print('其他内部实现的功能')


def func():
    print('外部的功能')


print('*************进入 with 之前************')

with MyContextManager() as f:
    print('进入with')
    # 上下文管理器对象 访问 其实例方法
    f.otherFunc()
    # with 语句块内执行 外部的方法
    func()
    print('离开with')


print('*************with完成之后*************')

执行结果

*************进入 with 之前************
访问资源
进入with
其他内部实现的功能
外部的功能
离开with
**********关闭资源**********
*************with完成之后*************

从上面代码可以看到,分析with 语句 的执行过程

1、使用with 执行上下文管理器的时候 会首先调用这个管理器类的 __enter__方法,(当然如果这个上下文管理器的类 有__init__方法的时候,还是会先执行初始化方法的)

2、enter 返回这个上下文管理器对象 f

3、上下文管理器对象 f 调用 自己 内部的实例方法

4、执行 with语句中其他的外部方法或语句块

5、步骤4执行完毕后,执行上下文管理器对象中的exit 方法

 

 

类比于 文件读写的流程:

with open('1.txt','r') as f:
print(f.read())

由上面可得 open 内部 肯定也实现了   __enter__ 和__exit__方法

1、 with 内部 open('1.txt','r') 首先执行了   __enter__  并返回了一个文件对象 f

2、文件对象 调用了 open 类 的实例方法 read

3、print 语句执行完毕后 调用__exit__方法 关闭这个文件对象

 

  

 

posted @ 2021-12-04 00:04  昆虫白  阅读(87)  评论(0)    收藏  举报