Python上下文管理器实践指南:自定义和内置用法

上下文管理器是一种强大的工具,用于自动管理资源(如文件、网络连接、数据库连接等)的分配和释放 。
在本文中,将深入探讨上下文管理器的工作原理、用途、自定义创建和内置实例,并提供丰富的代码示例,帮助你充分理解和应用 。
什么是上下文管理器?上下文管理器是一个对象 , 它定义了进入和退出上下文时应该执行的操作 。
通常,上下文是指一段代码块,在进入和退出该代码块时 , 需要执行某些特定的行为 。上下文管理器的目的是确保资源的正确分配和释放,无论代码块是否正常执行或引发异常 。
在Python/ target=_blank class=infotextkey>Python中 , 上下文管理器通常与with语句一起使用,以确保在with块内的操作完成后,相关资源会被正确释放,而无需手动处理 。with语句的语法如下:
with context_manager_expression as variable:# 在上下文中执行操作# 在退出上下文后,资源会被自动释放上下文管理器的协议上下文管理器协议定义了两个方法 , 用于进入和退出上下文:

  • __enter__(self): 进入上下文时执行的操作 。通常在这里进行资源的分配和初始化 。__enter__()方法可以返回一个对象,供as关键字后的变量接收 。
  • __exit__(self, exc_type, exc_value, traceback): 退出上下文时执行的操作 。通常在这里进行资源的释放和清理 。exc_type、exc_value和traceback是异常信息,如果有异常被引发 , 它们将被传递给__exit__()方法 。
使用内置的上下文管理器Python提供了一些内置的上下文管理器,包括但不限于以下几种:
1、文件上下文管理器处理文件的上下文管理器是open()函数的默认行为 。当你使用with语句打开文件时,文件会在退出with块后自动关闭,无需手动关闭文件 。
# 使用文件上下文管理器with open('example.txt', 'r') as file:data = https://www.isolves.com/it/cxkf/yy/Python/2023-11-16/file.read()# 在退出上下文后,文件会自动关闭2、网络连接上下文管理器一些Python库(如socket)提供了内置的上下文管理器,用于处理网络连接,会自动处理连接的建立和关闭 , 提供了方便的资源管理 。
import socketwith socket.socket(socket.AF_.NET, socket.SOCK_STREAM) as s:s.connect(('example.com', 80))# 在上下文中执行操作# 在退出上下文后,连接会自动关闭3、上下文管理器装饰器Python的contextlib模块提供了contextmanager装饰器,允许将一个生成器函数转换为上下文管理器 。
这是创建自定义上下文管理器的一种简便方式 。
from contextlib import contextmanager@contextmanagerdef my_context_manager():# 进入上下文时的操作yield# 生成器函数的中间部分是上下文的主体# 退出上下文时的操作# 使用自定义上下文管理器with my_context_manager() as cm:# 在上下文中执行操作# 在退出上下文后,资源会被自动释放创建自定义上下文管理器可以创建自定义上下文管理器来满足特定需求 。通常,自定义上下文管理器包含在一个类中,并实现__enter__()和__exit__()方法 。
示例代码,演示如何创建一个自定义文件计时器上下文管理器 , 用于测量文件操作的执行时间:
import timeclass FileTimer:def __init__(self, filename):self.filename = filenamedef __enter__(self):self.start_time = time.time()self.file = open(self.filename, 'r')return self.filedef __exit__(self, exc_type, exc_value, traceback):self.file.close()elapsed_time = time.time() - self.start_timeprint(f"File operation took {elapsed_time:.2f} seconds")# 使用自定义文件计时器上下文管理器with FileTimer('example.txt') as file:data = https://www.isolves.com/it/cxkf/yy/Python/2023-11-16/file.read()# 在退出上下文后,文件会自动关闭,并输出执行时间上下文管理器的异常处理上下文管理器可以处理异常 。
如果在上下文中发生异常,异常信息将被传递给__exit__()方法的参数 。可以在__exit__()中处理异常,例如执行回滚或记录异常信息 。
class DatabaseConnection:def __enter__(self):self.connect_db()# 连接数据库return selfdef __exit__(self, exc_type, exc_value, traceback):if exc_type:print(f"Error: {exc_type}, {exc_value}")self.rollback()# 回滚数据库操作else:self.commit()# 提交数据库操作self.disconnect_db()# 断开数据库连接嵌套上下文管理器可以在一个上下文管理器内部使用另一个上下文管理器 。允许以清晰的方式管理多个资源 。


推荐阅读