浅谈python的上下文管理器with的用法

 更新时间:2023年07月21日 09:31:39   作者:发条宇  
这篇文章主要介绍了浅谈python的上下文管理器with的用法,在一段代码执行前, 先执行__enter__中的代码用于预处理,然后执行 with 中间的代码,最后执行完这段代码之后再执行 exit 中的代码进行清理工作,需要的朋友可以参考下

如何理解上下文管理器, 那就是有先 有后, 中间是要处理的东西。

举个例子: 别墅独立小院, 是不是有个大门。每天进大门然后出大门(有先有后),中间呢 是你在这个小院里操作各种内容,比如打水。

上下文管理器指符合上下文协议的一个类,类中实现了__enter__方法 和 exit 方法。 在一段代码执行前, 先执行__enter__中的代码用于预处理,然后执行 with 中间的代码,最后执行完这段代码之后再执行 exit 中的代码进行清理工作。

常见的如:

文件的操作:打开文件,关闭文件
打开数据库,关闭数据库
入栈,出栈

都可以用上下文管理器来完成。

具体可以参考官网里这块的代码实现逻辑来加深理解。

上下文管理器格式:

class A():
    def __enter__(self):
        print('连接')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('断开连接')
        if(exc_tb):
            print('出现异常')
        else:
            print('无异常')
        return True

__enter__方法实现资源的连接过程 __exit__方式实现了资源的断开过程

with语句基本结构

with A() as b:
    # 相关操作代码放这里
-------------------------
with A():
    # 相关操作代码放这里

在with语句中的操作代码执行前,先执行__enter__中的代码;

操作代码执行完后,再执行__exit__中的代码 enter=>with=>exit

这段代码里需要理解一下as b 在 with A() as b 中,b的值为__enter__方法的返回值,一般情况下会写self即返回上下文管理器对象本身,但是也可以返回其他内容 __exit__方法中的参数除了self外还必须有exc_type,exc_val,exc_tb;

当操作代码部分没有出现异常时,三个参数的值都为空,当操作代码部分出现异常时分别传入异常的类型、信息、错误堆栈 __exit__的返回值可以是True或False,当返回True时若操作代码出现异常则在with语句外将不会给出异常(在__exit__中处理异常),当返回False时若操作代码出现异常则在with语句外给出异常(由外部处理异常)

举个数据库的简单例子

class DataBase():
    def query(self):
        print('查询数据库')
    def __enter__(self):
        print('连接数据库')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('断开数据库连接')
        if(exc_tb):
            print('出现异常')
        else:
            print('无异常')
        return True
with DataBase() as db:
    db.query()

在这里插入图片描述

到此这篇关于浅谈python的上下文管理器with的用法的文章就介绍到这了,更多相关python上下文管理器with内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 如何将 matplotlib 图表集成进到PDF 中

    Python 如何将 matplotlib 图表集成进到PDF 中

    这篇文章主要介绍了Python 如何将 matplotlib 图表集成进到PDF 中,文章介绍内容详细,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-03-03
  • python实现求最长回文子串长度

    python实现求最长回文子串长度

    最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果一个字符串正着读和反着读是一样的,那它就是回文串。今天我们就来探讨下这个问题
    2018-01-01
  • python中字符串变二维数组的实例讲解

    python中字符串变二维数组的实例讲解

    下面小编就为大家分享一篇python中字符串变二维数组的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python部署chineseocr_lite的实现示例

    python部署chineseocr_lite的实现示例

    本文主要介绍了python部署chineseocr_lite的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Python中实现从目录中过滤出指定文件类型的文件

    Python中实现从目录中过滤出指定文件类型的文件

    这篇文章主要介绍了Python中实现从目录中过滤出指定文件类型的文件,本文是一篇学笔记,实例相对简单,需要的朋友可以参考下
    2015-02-02
  • Kears+Opencv实现简单人脸识别

    Kears+Opencv实现简单人脸识别

    这篇文章主要为大家详细介绍了Kears+Opencv实现简单人脸识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • python3中set(集合)的语法总结分享

    python3中set(集合)的语法总结分享

    这篇文章主要总结了关于python3中set(集合)的语法的相关资料,文中给出了详细的示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • Python中time与datetime模块使用方法详解

    Python中time与datetime模块使用方法详解

    这篇文章主要为大家详细介绍了Python中time与datetime模块使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Python API 自动化实战详解(纯代码)

    Python API 自动化实战详解(纯代码)

    今天小编就为大家分享一篇Python API 自动化实战详解(纯代码),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 利用Pygame绘制圆环的示例代码

    利用Pygame绘制圆环的示例代码

    这篇文章主要介绍了利用Python中的Pygame模块绘制一个彩色的圆环,文中的示例代码讲解详细,对我们学习Pygame有一定帮助,需要的可以参考一下
    2022-01-01

最新评论