在本教程中,我们将学习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 
      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”关键字。当它被评估时,它将产生一个可以执行上下文管理的对象。用户可以使用类或带装饰器的函数来编写上下文管理器。

如何创建上下文管理器:

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

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

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

让我们看一个示例:

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

示例:

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。运行程序后,以下方法按顺序执行:

  • __init__()
  • __enter__()
  • 语句体,即“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('javatiku')    
print (file.closed)  

输出:

True

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

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

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

如何通过上下文管理器管理数据库连接

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

安装pymongo:

要通过上下文管理器管理数据库连接,用户首先必须使用以下命令安装“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__()方法时,将创建一个具有“host_name”为“localhost”和端口为“27017”的“mongo_db_connection_manager”对象。
  • __enter__()方法将打开“mongodb”连接,并将“mongo_db_connection_manager”对象返回给变量“mongo”。
  • “SampleDB”数据库将访问“test”连接,检索具有“_id = 142”的文档。它将打印文档的name字段。
  • __exit__()方法将负责在退出“with”语句块后关闭文件,这是一个拆卸操作。

结论

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

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程