with上下文管理器

Myth丶恋晨 2022-05-12 12:16 344阅读 0赞

1.with 语句的执行过程:

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

2. with 语句的执行原理

  1. 实际上,在文件操作时,并不是不需要写文件的关闭,而是文件的关闭操作在 with 的上下文管理器中的协议方法里已经写好了。
  2. 当文件操作执行完成后, with语句会自动调用上下文管理器里的关闭语句来关闭文件资源。

3.上下文管理器

  1. with 语句在执行时,需要调用上下文管理器中的 __enter__ __exit__ 两个方法。
  2. __enter__ 方法会在执行 with 后面的语句时执行,一般用来处理操作前的内容。比如一些创建对象,初始化等。
  3. __exit__ 方法会在 with 内的代码执行完毕后执行,一般用来处理一些善后收尾工作,比如文件的关闭,数据库的关闭等。

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

  1. class MyCount(object):
  2. def __init__(self, x, y):
  3. self.__x = x
  4. self.__y = y
  5. def __enter__(self):
  6. """with退出时自动执行的语句"""
  7. print("with退出时执行的语句")
  8. # 需要注意的是:
  9. # 1.MyCount()创建对象并命名为mc====>with MyCount(6, 0) as mc:相当于mc = MyCount(6, 0)
  10. # 2.在使用div方法之前会先调用__enter__方法,self代表的就是mc
  11. # 3.所以直接返回self即可,也可以不返回,没有影响
  12. return self
  13. def __exit__(self, exc_type, exc_val, exc_tb):
  14. # 通过 参数接收到的值,来判断程序执行是否出现异常
  15. # 如果是 None ,说明没有异常
  16. print("with结束时自动执行的语句")
  17. if exc_type == None:
  18. print('计算正确执行')
  19. else:
  20. # 否则出现异常,可以选择怎么处理异常
  21. print(exc_type)
  22. print(exc_val)
  23. print(exc_tb)
  24. # 返回值决定了捕获的异常是否继续向外抛出
  25. # 如果是 False 那么就会继续向外抛出,程序会看到系统提示的异常信息
  26. # 如果是 True 不会向外抛出,程序看不到系统提示信息,只能看到else中的输出
  27. return True
  28. def div(self):
  29. print(self.__x / self.__y)
  30. with MyCount(6, 0) as mc:
  31. mc.div()

执行结果:

70

5.总结

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

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

1445380-20180903211901788-1752749014.png

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读