Python 中的上下文管理器

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

管理资源:

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

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

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

例 1:


with open("text_file.txt") as file:   
    data = file.read()

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

例 2:


file_descriptors = []
for Y in range(10000):
    file_descriptors.append( open ('test_file.txt', 'w'))

输出:

OSError                                   Traceback (most recent call last)
 in <module>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'</module> 

上面的例子是文件描述符泄漏的情况。出现错误,提示“打开的文件太多”。发生这种情况是因为有太多打开的文件,而它们没有关闭。用户可能会忘记关闭打开的文件。

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

如果程序的块引发了异常,或者有许多返回路径的复杂算法,那么很难在所有地方关闭一个文件。

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

如何创建上下文管理器:

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

enter()方法将返回必须管理的资源。

exit()方法除了执行清理操作之外,不会返回任何东西。

让我们看一个例子:

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

示例:


class context_manager():
    def __init__(self):
        print ("The 'init' method is called")          
    def __enter__(self):
        print ("The 'enter' method is called")
        return self      
    def __exit__(self, exc_type, exc_value, exc_traceback):
        print ("The 'exit' method is called")
with context_manager() as manager:
    print ("The 'with' statement is block")

输出

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()
  • _ 输入 _()
  • 语句体,它是“with”语句块中的代码。
  • exit(),在此方法中,参数用于管理异常。

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

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

示例:


class file_manager():
    def __init__(self, file_name, mode):
        self.filename = file_name
        self.mode = mode
        self.file = None          
    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file      
    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.file.close()  
# At last, load the file 
with file_manager('test_file.txt', 'w') as file:
    file.write('JavaTpoint')  
print (file.closed)

输出:

True

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

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

  • 将创建一个“file_manager”对象,文件名为“text_file.txt”,执行 init()方法时模式为“w”(write)。
  • enter()方法将在写入模式下打开“text_file.txt”,并将“file_manager”对象返回给变量“file”。
  • 文本“JavaTpoint”将被写入文件。
  • exit()方法将在退出“with”语句块后关闭文件,这是一个拆卸操作。
    当“print (file.closed)”语句运行时,用户将获得输出“True”,因为“file_manager”已经关闭了文件,否则需要显式关闭文件。

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

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

安装平壤:

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


!pip3 instal pymongo

示例:


from pymongo import MongoClient as moc
class mongo_db_connection_manager():
    def __init__(self, host_name, port = '27017'):
        self.hostname = host_name
        self.port = port
        self.connection = None 
    def __enter__(self):
        self.connection = moc(self.hostname, self.port)
        return self  
    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.connection.close() 
# Now, connect with a localhost
with mongo_db_connection_manager('localhost', 27017) as mongo:
    collection_1 = mongo.connection.SampleDb.test
    data_1 = collection_1.find({'_id': 142})
    print (data_1.get(name))

输出:

Test

说明:

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

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

结论

在本教程中,我们讨论了 Python 中的内容管理器、如何创建内容管理器、以及它如何在资源管理、文件管理和管理数据库连接方面提供帮助。


原创文章,作者:J43E1,如若转载,请注明出处:https://www.506064.com/n/130405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
J43E1J43E1
上一篇 2024-10-03 23:28
下一篇 2024-10-03 23:28

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29

发表回复

登录后才能评论