Python中的上下文管理器

2025年4月17日 | 阅读 5 分钟

在本教程中,我们将学习 Python 中的“上下文管理器”,以及它如何有助于管理资源、文件描述符和数据库连接。

管理资源

在任何编程语言中,用户使用文件操作或数据库连接等资源都非常普遍。

但是,所有这些资源都有一个限制。因此,主要问题是确保在使用后释放这些资源。

因为如果它们没有被释放,可能会导致资源泄漏,这可能会导致系统变慢或崩溃。如果机器设置了可以自动拆除资源的系统,那将非常有帮助。在 Python 中,用户可以通过使用上下文管理器来实现这一点,上下文管理器用于促进资源的正确处理。执行文件操作最流行的方法是使用 Python 中的“with”关键字。

示例 1

让我们看一个文件管理的例子。当一个文件被打开时,文件描述符将被消耗,这是一个有限的资源。进程一次只能打开有限数量的文件。

示例 2

输出

OSError                                   Traceback (most recent call last)
 in 
      1 file_descriptors = []
      2 for Y in range(10000):
----> 3 file_descriptors.append( open ('test_file.txt', 'w'))
OSError: [Errno 24] Too many open files: 'test_file.txt'

上面的例子是文件描述符泄漏的情况。出现了一个错误,说“打开的文件太多”。这是因为有太多打开的文件而没有关闭。用户可能会忘记关闭打开的文件。

如何使用上下文管理器管理资源

如果程序块引发异常或包含许多返回路径的复杂算法,那么在所有地方关闭文件将非常困难。

大多数时候,用户在处理文件时会使用其他编程语言中的“try-except-finally”块,以确保即使发生异常,文件资源在使用后也会被关闭。但在 Python 中,他们可以使用“上下文管理器”来管理资源。用户可以使用“with”关键字。当它被评估时,它将生成一个可以执行上下文管理的 a 对象。我们可以通过使用类或带装饰器的函数来编写上下文管理器。

如何创建上下文管理器

当用户创建上下文管理器时,他们需要确保该类具有以下方法:__enter__() 和 __exit__()。

__enter__() 方法将返回需要管理的资源。

__exit__() 方法不返回任何内容,但执行清理操作。

让我们看一个例子

  • 首先,我们将创建一个名为“context_manager”的简单类,以了解使用类方法创建上下文管理器的基本结构。

示例

输出

The 'init' method is called
The 'enter' method is called
The 'with' statement is block
The 'exit' method is called

示例 -

在上面的代码中,我们创建了“context_manager”对象。它被赋给“as”关键字后面的变量,即 manager。运行程序后,以下方法按顺序执行:

  • __int__()
  • __enter__()
  • 语句体,即“with”语句块内的代码。
  • __exit__(),在此方法中,参数用于管理异常。

使用上下文管理器进行文件管理

现在,我们将应用上述概念来创建一个类,该类有助于文件资源管理。“file_manager”类将帮助打开文件、读取或写入内容,然后关闭文件。

示例

输出

True

如何使用上下文管理器和“with”语句进行文件管理

用户执行“with”语句块后,操作将按以下顺序执行:

  • 当 __init__() 方法执行时,将使用“text_file.txt”作为文件名,“w”(写入)作为模式创建一个“file_manager”对象。
  • __enter__() 方法将以写入模式打开“text_file.txt”,并将“file_manager”对象返回给变量“file”。
  • 文本“JavaTpoint”将被写入文件。
  • __exit__() 方法将在退出“with”语句块后负责关闭文件,这是一个拆除操作。
    当执行“print (file.closed)”语句时,用户将获得输出“True”,因为“file_manager”已经关闭了文件,而这本来需要显式完成。

如何使用上下文管理器管理数据库连接

现在,我们将展示如何创建一个简单的数据库连接管理系统。与文件描述符一样,一次可以打开的数据库连接数量是有限制的。因此,我们使用上下文管理器,因为它有助于管理到数据库的连接,因为用户可能忘记关闭连接。

安装 pymongo

要通过内容管理器管理数据库连接,用户首先必须使用以下命令安装“pymongo”库:

示例

输出

Test

说明

在上面的代码中,执行“with”语句块后,将按顺序执行以下操作:

  • 当 __init__() 方法执行时,将创建一个“mongo_db_connection_manager”对象,将“localhost”作为“host_name”,端口等于“27017”。
  • __enter__() 方法将打开“mongodb”连接,并将“mongo_db_connection_manager”对象返回给变量“mongo”。
  • 将访问“SampleDB”数据库的“test”连接,并检索 _id = 147 的文档。它将打印文档的 name 字段。
  • __exit__() 方法将在退出“with”语句块后负责关闭文件,这是一个拆除操作。

结论

在本教程中,我们讨论了 Python 中的上下文管理器,如何创建**上下文管理器**,以及它如何有助于资源管理、文件管理和数据库连接管理。