首页 > 编程语言 >Python教程(27)——如何使用Python中的上下文管理器

Python教程(27)——如何使用Python中的上下文管理器

时间:2024-02-18 20:34:03浏览次数:19  
标签:__ 27 管理器 Python self file 上下文

当我们在编写代码时,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到了一些异常情况,我们需要关闭资源,不然会导致资源泄露,虽然我们可以通过手动的方式来关闭,但如果有多个异常情况需要考虑的话,万一不小心漏了一处,就芭比Q了。所以,如果有一种更加优雅的方式来处理资源泄露的问题,那必定是非常nice的。而上下文管理器就是在这样的背景下诞生的。

上下文管理器

上下文管理器(Context Manager)是 Python 中用来管理资源、执行特定操作以及处理异常的对象。上下文管理器通过实现特定的方法使得它们可以在 with 语句中被使用,确保资源的正确获取和释放。

在 Python 中,上下文管理器通常使用类中的特殊方法 __enter__ 和 __exit__ 来实现。具体来说:

1、 __enter__ 方法在进入 with 语句块时被调用,通常用于获取资源或者执行一些初始化操作,一般返回管理器对象。

2、 __exit__ 方法在离开 with 语句块时被调用,无论代码块中是否发生异常,该方法都会被执行。这个方法通常用来释放资源,清理工作以及处理异常情况。放法中含有三个参数分别是:异常类型、异常实例对象和异常栈对象

class MyContextManager:
    def __enter__(self):
        print("Entering the context")
        # 执行一些初始化操作,比如打开资源
        return self
        
    def __exit__(self, exc_type, exc_value, traceback):
        print("Exiting the context")
        # 执行一些清理操作,比如关闭资源
        if exc_type is not None:
            print(f"Exception: {exc_type}, {exc_value}")
        # 返回 True 表示异常已经被处理,返回 False 则异常会被传播
        return True

# 使用上下文管理器
with MyContextManager() as manager:
    print("Inside the context")
    # 执行一些操作,比如读写资源
    # 如果在这里发生了异常,异常会被传递给 __exit__ 方法进行处理

比如上面的这个示例中,MyContextManager 是一个简单的上下文管理器类,通过实现 __enter__ 和 __exit__ 方法来定义上下文管理器的行为。在 with 语句块中使用该上下文管理器,会执行相应的操作(进入、执行、退出上下文),确保资源的正确管理。

上面的代码运行结果:

Entering the context
Inside the context
Exiting the context

with语句

很多人说with语句是用来创建上下文管理器,准确的说,这样子的说法是不对的。之前的例子中,MyContextManager是一个上下文管理器的类,而我们所谓的创建上下文管理器,无非就是创建上下文管理器的对象。那么以下这样子不就是创建了一个上下文管理器对象吗?

m = MyContextManager()

所以准确的说,with语句是Python提供的一种管理上下文的语法结构,能够自动调用上下文管理器的__enter__和__exit__方法。通过with语句,可以确保在进入和退出代码块时自动执行必要的操作。

例如,使用with语句的上下文管理器来打开和关闭文件:

with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

# 文件在with语句块结束后会自动关闭,即使发生异常也会正确关闭文件

open函数返回的文件对象是一个上下文管理器,本身就不需要再去实现了,通过使用with关键字,确保在代码块执行完毕后文件会被正确关闭。无需手动调用 file.close() 方法。这样可以提高代码可读性和可维护性,避免忘记关闭文件而导致资源泄漏的问题。

当然我们也可以自己手动实现一个file上下文管理器

class FileContextManager:
    def __init__(self, file_name, mode):
        self.file_name = file_name
        self.mode = mode

    def __enter__(self):
        self.file = open(self.file_name, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_value, exc_traceback):
        if self.file:
            self.file.close()

# 使用自定义的文件上下文管理器类来打开文件
with FileContextManager('example.txt', 'w') as file:
    file.write("程序员一点来啦!")

这个就是一个比较简单的文件上下文管理器,FileContextManager('example.txt', 'w')和上面open('example.txt', 'r')功能是差不多的。

以上就是关于上下文管理器的一些简单介绍。总的来说,上下文管理器是 Python 提供的一种非常方便的资源管理机制,可以帮助我们更好地管理和释放资源,简化代码逻辑,提高代码的健壮性,写出更加优雅的代码,在项目开发中使用起来非常的舒服。

更多精彩内容,请关注同名公众:一点sir(alittle-sir)

标签:__,27,管理器,Python,self,file,上下文
From: https://www.cnblogs.com/kiwiblog/p/18019914

相关文章

  • 跨界协作:借助gRPC实现Python数据分析能力的共享
    gRPC是一个高性能、开源、通用的远程过程调用(RPC)框架,由Google推出。它基于HTTP/2协议标准设计开发,默认采用ProtocolBuffers数据序列化协议,支持多种开发语言。在gRPC中,客户端可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用......
  • python相关知识
    1python原理Python先把代码编译成字节码,交给虚拟机执行。.pyc文件是字节码在磁盘上的表现形式字节码在虚拟机程序里面对应的对象是PyCodeObject对象(C++对象)PyCodeObjecttypedefstruct{PyObject_HEADintco_argcount;/*位置参数个数*/intco_nlocals;......
  • NewStarCTF 2023 WEEK2|REVERSE SMC 使用IDApython静态解决SMC
    先来一篇IDApyhotn的指令教程https://www.cnblogs.com/zydt10/p/17676018.html*自己编的这题对应的expa=[0x11,0x22,0x33,0x44]foriinrange(38):result=a[i&3]ida_bytes.patch_byte(0x403040+i,get_wide_byte(0x403040+i)^result)在IDA中运行完exp之后,......
  • 用python脚本自动发送钉钉消息出现服务器异常的报错: HTTPSConnectionPool(host='oapi.
    一、问题描述执行python脚本发送钉钉消息,出现报错:HTTPSConnectionPool(host='oapi.dingtalk.com',port=443):Maxretriesexceededwithurl:/robot/send?access_token=43df999582e899dc6815c9d6346c9d253060259625c92e4f166e25ea58e5bdb5&timestamp=1708242748918&sign......
  • python 日期时间学习
    importdatetimeimporttimefromdatetimeimporttimedeltaclassTimeUtil:"""staticmethod:静态方法,参数没有要求,和类没有绑定关系,跟全局变量差不多classmethod:类方法,是一个函数修饰符,第一个参数是cls"""@staticmethoddefget_current_yea......
  • [python] 内置函数: zip()
    zip()作用将复数个可循环类型(iterables)中的元素组装为一组tuple;组装规则是根据各自所在的位置决定;当最短的可循环类型内已经没有元素的时候,组装终止传入参数以及返回类型参数是可循环的数据类型,例如数组,元组,字符串等返回类型是搭载复数元组的某种可循环类型......
  • C#调用python开发的方法
    一、可以通过使用IronPython库来实现,首先需要安装IronPythonNuGet包,然后导入相关命名空间。接下来,我们创建了一个Python运行时引擎对象,并使用该引擎加载并编译指定路径下的Python文件(也可以直接传递Python代码作为字符串)。最后,我们可以像调用其他C#方法一样调用Python函数,将结果......
  • python 文件上传
    #-*-coding:utf-8-*-fromtornado.webimporturlimporttornado.webfromtornadoimporthttpclientfrom.baseimportBaseHandlerfromutils.utilsimportcreate_passwordfromutils.decoratorsimportjwt_async,auth_validated,role_validatedimportpeew......
  • 25个常见的python系统设计源码(python+mysql+vue)
    收集整理了25个常见的python系统设计源码。可以用于课程作业或者毕业设计。所有系统都带源码和文档。1.网上商城系统这是一个基于python+vue开发的商城网站,平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。......
  • 基于python+django+mysql的小区物业管理系统
    该系统是基于python+django开发的小区物业管理系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者留言。主要功能有:业主管理、报修管理、停车管理、资产管理、小区管理、用户管理、日志管理、系统信息。演示地址http://wuye.gitapp.cn/admin后......