iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中的上下文管理器原理是什么
  • 150
分享到

Python中的上下文管理器原理是什么

2023-07-05 11:07:54 150人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇“python中的上下文管理器原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的上下文管理器原理是

这篇“python中的上下文管理器原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的上下文管理器原理是什么”文章吧。

with语句

在我们日常使用场景中,经常会操作一些资源,比如文件对象、数据库连接、Socket连接等,资源操作完了之后,不管操作的成功与否,最重要的事情就是关闭该资源,否则资源打开太多而没有关闭,程序会报错,以文件操作为例,通常我们会这样写:

f = open('file.txt', 'w')try:    f.write("Hello")finally:    f.close()

但既然close方法是必须的操作,那就没必要显式地调用,所以Python给我们提供了一种更优雅的方式,使用with语句:

with open('file.txt', 'w') as f:    f.write("Hello")

在退出with语句下的代码块之后,f 对象会自动执行自己的close方法,实现资源的释放,简洁优雅。

上下文管理器原理

上下文管理器实际是内部实现了__enter__和__exit__方法的对象。

当我们使用with语法时:

__enter__()方法:返回一个值,可以将它赋值给as后面的对象,例如上面的中的f;

__exit__()方法:with语句退出或者发送异常时会执行这个方法。

__enter__方法说明

上下文管理器的__enter__方法是可以带返回值的,默认返回None,这个返回值通过with…as…中的 as 赋给它后面的那个变量,所以 with EXPR as VAR 就是将EXPR对象__enter__方法的返回值赋给 VAR。

当然with...as...并非固定组合,单独使用with...也是可以的,上下文管理器的__enter__方法还是正常执行,只是这个返回值并没有赋给一个变量,with下面的代码块也不能使用这个返回值。

__exit__方法说明

上下文管理器的__exit__方法接收3个参数exc_type、exc_val、exc_tb,如果代码块BLOCK发生了异常e并退出,这3个参数分别为type(e)、str(e)、e.__traceback__,否则都为None。

同样__exit__方法也是可以带返回值的,这个返回值应该是一个布尔类型True或False,默认为None(即False)。如果为False,异常会被抛出,用户需要进行异常处理。如果为True,则表示忽略该异常。

一个上下文管理器一般使用如下:

with EXPR as VAR:    BLOCK

上述代码的执行过程等价于:

ContextManager = EXPRVAR = ContextManager.__enter__()try:    BLOCKfinally:    ContextManager.__exit__()

f 对象就是把自己的close方法定义在了它的__exit__方法内部,实现了代码块BLOCK执行完之后自动关闭自身。

自定义上下文管理器

下面我们定义一个文件类,内部实现了__enter__和__exit__两个方法:

class File:    def __init__(self, filename, mode):        self.filename = filename        self.mode = mode    def __enter__(self):        print("进入")        self.f = open(self.filename, self.mode)        return self.f    def __exit__(self, exc_type=None, exc_val=None, exc_tbs=None):        print("退出")        self.f.close()

这时候File类就是一个上下文管理器

我们分别通过 with语句 和 try/finally语句 使用File类对文件进行写入操作

通过with语句执行:

with File('file.txt', 'w') as f:    print("正在写入...")    f.write('Hello')

控制台输出:

进入
正在写入...
退出

并得到了一个写了 Hello 的 file.txt 文件

通过try/finally语句执行:

ContextManager = File('file.txt', 'w')VAR = ContextManager .__enter__()try:    print("正在写入...")    VAR.write('Hello')finally:    ContextManager.__exit__()

控制台输出:

进入
正在写入...
退出

并得到了一个写了 Hello 的 file.txt 文件

两者输出一致,所以验证了二中执行过程的等价关系是正确的。

contextmanager 装饰器

Python还提供了一个contextmanager装饰器,允许用户将一个生成器定义为上下文管理器,该装饰器将生成器中的代码通过yield语句分成两部分,yield之前的代码为__enter__方法,yield之后的代码为__exit__方法,yield的返回值即__enter__方法的返回值,用于赋给as后的变量。

下面我们通过contextmanager装饰器也实现一个关于文件的上下文管理器:

from contextlib import contextmanager@contextmanagerdef open_file(filename, mode):    print('进入')    f = open(filename, mode)    try:        yield f    finally:        print('退出')        f.close()

说明:这里使用 try/finally 是确保yield的过程中就算出现异常,文件也能正常关闭,当然这里也能处理异常,使用 try/except/finally 即可。

通过with语句执行:

with open_file('file.txt', 'w') as f:    print("正在写入...")    f.write('Hello')

执行结果跟之前的上下文管理器执行结果一致,说明contextmanager装饰器也能定义一个上下文管理器。

以上就是关于“Python中的上下文管理器原理是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网Python频道。

--结束END--

本文标题: Python中的上下文管理器原理是什么

本文链接: https://www.lsjlt.com/news/351377.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中的上下文管理器原理是什么
    这篇“Python中的上下文管理器原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的上下文管理器原理是...
    99+
    2023-07-05
  • python中上下文管理器的原理是什么
    今天就跟大家聊聊有关python中上下文管理器的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WE...
    99+
    2023-06-14
  • python上下文管理器是什么
    本篇文章给大家分享的是有关python上下文管理器是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,开发程序...
    99+
    2023-06-14
  • 详解Python中的上下文管理器原理
    目录with语句上下文管理器原理自定义上下文管理器contextmanager 装饰器with语句 在我们日常使用场景中,经常会操作一些资源,比如文件对象、数据库连接、Socket连...
    99+
    2023-03-11
    Python上下文管理器原理 Python上下文管理器使用 Python上下文管理器
  • 什么是上下文管理器
    一、上下文管理器 上下文管理器(Context Manager)是Python中的一种编程模式,用于管理资源的获取和释放。它通过定义一个特定的上下文环境,确保在进入和离开这个环境时,相关资源会被正确地获取和释放。 二、实现方式 在Pytho...
    99+
    2023-10-29
    上下文 管理器
  • Python上下文管理器的作用是什么
    本篇内容介绍了“Python上下文管理器的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明上下文管理器允许在需要时准确分配和释放...
    99+
    2023-06-20
  • Python中的装饰器和上下文管理器的原理和使用场景是什么?
    Python中的装饰器和上下文管理器是两个非常有用的特性,它们可以帮助我们更好地组织和管理代码,并提高代码的可复用性。本文将分别介绍装饰器和上下文管理器的原理和使用场景,并给出具体的代码示例。一、装饰器的原理和使用场景原理:装饰器是一种在不...
    99+
    2023-10-22
    原理 (Principle) 关键词: 上下文管理器 (Context Manager) 装饰器 (Decorator)
  • JavaScript中执行上下文的原理是什么
    这期内容当中小编将会给大家带来有关JavaScript中执行上下文的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。执行上下文执行上下文是当前代码的执行环境。执行上下文主要是三种类型:全局执行上下...
    99+
    2023-06-15
  • Python上下文管理器是什么及怎么使用
    这篇“Python上下文管理器是什么及怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python上下文管理器是什么及...
    99+
    2023-07-06
  • Python上下文管理器的本质及用法是什么
    今天就跟大家聊聊有关Python上下文管理器的本质及用法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 上下文管理器是什么?举个例子,你在写Python代码的时候经常将一系...
    99+
    2023-06-17
  • Python中的内存管理的原理是什么?
    Python中的内存管理的原理是什么?Python是一种高级的、动态类型的编程语言,具有自动垃圾回收功能。Python内存管理的原理基于引用计数机制和垃圾回收机制。引用计数机制是Python内存管理的基础。每个对象都会有一个引用计数器,用于...
    99+
    2023-10-22
    内存管理原理 Python内存管理 内存分配策略
  • Python上下文管理器怎么使用
    这篇文章主要介绍了Python上下文管理器怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python上下文管理器怎么使用文章都会有所收获,下面我们一起来看看吧。什么是上...
    99+
    2024-04-02
  • Python深入02 上下文管理器
    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with...as...关闭文件...
    99+
    2023-06-02
  • 怎么在python中使用上下文管理
    本篇文章为大家展示了怎么在python中使用上下文管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型...
    99+
    2023-06-14
  • python上下文管理器怎么实现类
    本篇内容介绍了“python上下文管理器怎么实现类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明通过定义__enter__和__exit...
    99+
    2023-06-20
  • 如何在python中使用上下文管理器
    如何在python中使用上下文管理器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pytho...
    99+
    2023-06-14
  • Python中的装饰器和上下文管理器是如何工作的?
    Python中的装饰器和上下文管理器是如何工作的?在Python中,装饰器和上下文管理器是两个非常有用的概念和功能。它们都是为了简化代码、增加代码可读性以及方便代码的重用。一、装饰器装饰器是Python中一种用于修改函数的行为的特殊函数。它...
    99+
    2023-10-22
    装饰器 上下文管理器 Python工作
  • python上下文管理器协议的实现
    目录前言todo:版本1todo:版本2前言 在上下文管理器协议的过程中,涉及到两个魔术方法__enter__方法 和 __exit__方法 在python中所有实现了上下文管理器协...
    99+
    2024-04-02
  • 深人了解Python上下文管理器
    目录with语句上下文管理器创建基于类的上下文管理器@contextmanager 装饰器总结下面先来介绍一下with关键字在文件读写中的应用,简单了解上下文管理器的功能。 with...
    99+
    2024-04-02
  • Python上下文管理器深入讲解
    目录引子概念上下文管理协议(Context Management Protocol)上下文管理器(Context Manager)引子 上下文管理器是一种简化代码的有力方式,其内部也...
    99+
    2022-12-21
    Python上下文管理器 Python上下文
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作