with上下文管理器

1.with 语句的执行过程:

在执行 with 语句时,首先执行 with 后面的 open 代码
执行完代码后,会将代码的结果通过 as 保存到 f 中
然后在下面实现真正要执行的操作
在操作后面,并不需要写文件的关闭操作,文件会在使用完后自动关闭

2. with 语句的执行原理

实际上,在文件操作时,并不是不需要写文件的关闭,而是文件的关闭操作在 with 的上下文管理器中的协议方法里已经写好了。

当文件操作执行完成后, with语句会自动调用上下文管理器里的关闭语句来关闭文件资源。

3.上下文管理器

with 语句在执行时,需要调用上下文管理器中的 __enter__ 和 __exit__ 两个方法。

__enter__ 方法会在执行 with 后面的语句时执行,一般用来处理操作前的内容。比如一些创建对象,初始化等。

__exit__ 方法会在 with 内的代码执行完毕后执行,一般用来处理一些善后收尾工作,比如文件的关闭,数据库的关闭等。

4.自定义上下文管理器,代码如下(注释很重要!!!)

class MyCount(object):
    def __init__(self, x, y):
        self.__x = x
        self.__y = y

    def __enter__(self):
        """with退出时自动执行的语句"""
        print("with退出时执行的语句")

        # 需要注意的是:
        # 1.MyCount()创建对象并命名为mc====>with MyCount(6, 0) as mc:相当于mc = MyCount(6, 0)
        # 2.在使用div方法之前会先调用__enter__方法,self代表的就是mc
        # 3.所以直接返回self即可,也可以不返回,没有影响
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 通过 参数接收到的值,来判断程序执行是否出现异常
        # 如果是 None ,说明没有异常
        print("with结束时自动执行的语句")

        if exc_type == None:
            print('计算正确执行')
        else:
            # 否则出现异常,可以选择怎么处理异常
            print(exc_type)
            print(exc_val)
            print(exc_tb)
        # 返回值决定了捕获的异常是否继续向外抛出
        # 如果是 False 那么就会继续向外抛出,程序会看到系统提示的异常信息
        # 如果是 True 不会向外抛出,程序看不到系统提示信息,只能看到else中的输出
        return True

    def div(self):
        print(self.__x / self.__y)


with MyCount(6, 0) as mc:
    mc.div()

 执行结果:

5.总结

  1. with 语句主要是为了简化代码操作。
  2. with 在执行过程中,会自动调用上下文管理器中的 __enter__ 和 __exit__ 方法
  3. __enter__ 方法主要用来做一些准备操作
  4. __exit__ 方法主要用来做一些善后工作

如果你和我有共同爱好,我们可以加个好友一起交流!

猜你喜欢

转载自blog.csdn.net/ywk_hax/article/details/82749903
今日推荐