Python上下文管理器深入讲解

 更新时间:2022年12月21日 16:59:13   作者:ZYM66  
Python有三大神器,一个是装饰器,一个是迭代器、生成器,最后一个就是今天文章的主角 -- 「上下文管理器」。上下文管理器在日常开发中的作用是非常大的,可能有些人用到了也没有意识到这一点

引子

上下文管理器是一种简化代码的有力方式,其内部也蕴含了很多Python的编程思想,今天我们就来探究一下Python的上下文管理器。

大家之前都知道,使用Python打开文件的时候最好要使用with语句,因为这样就算在文件操作中出现了异常,也不会导致内存泄露

代码示例:

最简单的文件打开方式(容易导致内存泄露)

f = open("./xxx.txt")
f.close()

安全的文件打开方式,虽然相对复杂但是有效

# 打开文件
f = open('file.txt')
try:
    for line in f:
        # 读取文件内容 执行其他操作
        # do_something...
finally:
    # 保证关闭文件
    f.close()

我们最经常使用的文件打开方式

with open('file.txt', "r") as r:
	pass

如果一个对象要用with语句,那内部要定义__enter__()方法和__exit__()方法。

以下为一个示例

class TestContext:
    def __init__(self, val):
        self.val = val
    def __enter__(self):
        print('进入enter')
        return self.val
    def __exit__(self, exc_type, exc_value, exc_tb):
        print("进入exit")
        print('exc_type: %s' % exc_type)
        print('exc_value: %s' % exc_value)
        print('exc_tb: %s' % exc_tb)
with TestContext(12) as t:
    print("进入with内部")
    raise ValueError
    print('t: %s' % t)

运行后结果如下图

不难看出,语句的调用顺序

先进入__enter__()中, 该方法的返回值赋值给上述代码中with后边的t。如果with下的语句出现了异常就会先执行__exit__()语句中的内容。如果没有发生异常,就在执行完毕with下方语句之后执行__exit__()语句。

概念

上下文管理协议(Context Management Protocol)

包含方法 enter() 和 exit() ,支持该协议的对象要实现这两个方法。

上下文管理器(Context Manager)

支持上下文管理协议的对象,这种对象必须实现 enter() 和 exit() 方法。

上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。

通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。

enter()

  • with语句执行时,先获取上下文管理器对象,随后调用其 enter()
  • 若有 as var 语句,则将返回值赋给变量var
  • 可以返回上下文管理器对象本身,也可以是其他相关对象

exit()

  • 带有三个参数 exc_type, exc_val, exc_tb
  • 若上下文管理器对象执行无异常,则三个参数均为 None
  • 若发生异常,则三个参数分别为 异常类型,异常值和tracback信息

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

相关文章

  • Python调用ChatGPT的API实现文章生成

    Python调用ChatGPT的API实现文章生成

    最近ChatGPT大火,在3.5版本后开放了接口API,所以很多人开始进行实操,这里我就用python来为大家实现一下,如何调用API并提问返回文章的说明
    2023-03-03
  • 介绍Python的Urllib库的一些高级用法

    介绍Python的Urllib库的一些高级用法

    这篇文章主要介绍了Python的Urllib库的一些高级用法,是用Python编写爬虫的一些基础知识,需要的朋友可以参考下
    2015-04-04
  • Python fileinput模块如何逐行读取多个文件

    Python fileinput模块如何逐行读取多个文件

    这篇文章主要介绍了Python fileinput模块如何逐行读取多个文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 解决Python对齐文本字符串问题

    解决Python对齐文本字符串问题

    这篇文章主要介绍了解决Python对齐文本字符串问题,需要的朋友可以参考下
    2019-08-08
  • 女神相册密码忘记了 我只用Python写了20行代码

    女神相册密码忘记了 我只用Python写了20行代码

    这篇文章主要介绍了怎么样用Python写了20行代码来破解找回已经忘记的密码,密码的排列组合是有限的,遍历尝试就能够试出正确的密码,但这个工作要怎么用python实现,请看下文
    2021-08-08
  • Python  PYQT界面点击按钮随机变色功能

    Python  PYQT界面点击按钮随机变色功能

    遇到这样的需求写一个pyqt界面,要求界面有一个按钮,每次点击这个按钮,就会生成一个10以内的随机数,当随机数出现的时候,界面底色要变成对应的颜色,同时要求随机数会在界面中展示出来,并且按钮和数字的颜色不会改变,下面给大家分享源代码,一起看看吧
    2024-08-08
  • python的类方法和静态方法

    python的类方法和静态方法

    这篇文章主要介绍了python的类方法和静态方法,以实例形式分析了Python中类方法和静态方法的实现技巧与应用方法,需要的朋友可以参考下
    2014-12-12
  • Django使用Mysql数据库已经存在的数据表方法

    Django使用Mysql数据库已经存在的数据表方法

    今天小编就为大家分享一篇Django使用Mysql数据库已经存在的数据表方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • PyInstaller安装包瘦身指南

    PyInstaller安装包瘦身指南

    直接pyinstaller打包的话,如果当前pip环境安装的库较多的话,会导致生成的可执行exe程序文件过大,本文详细的介绍了PyInstaller安装包瘦身的过程,感兴趣的可以了解一下
    2023-03-03
  • Python将主机名转换为IP地址的方法

    Python将主机名转换为IP地址的方法

    今天小编就为大家分享一篇Python将主机名转换为IP地址的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08

最新评论