我们在写作的时候,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到一些异常,就需要关闭资源,否则会导致资源泄露,虽然我们可以手动关闭,但是如果有多个异常需要考虑,万一不小心漏掉了一个, 这将是芭比娃娃Q。 所以,如果有一种更优雅的方法来处理资源泄漏,那就太好了。 正是在这种背景下,Context Manager 诞生了。
上下文管理器是 Python 中的一个对象,用于管理资源、执行特定操作和处理异常。 上下文管理器实现特定方法,使它们在 with 语句中可用,以确保正确获取和释放资源。
在 Python 中,上下文管理器通常使用类中的特殊方法实现,输入和退出。 具体说来:
1. enter 方法在进入 with 语句块时调用,通常用于获取资源或执行一些初始化操作,一般返回 manager 对象。
2.退出方法在离开with块时调用,无论**块是否发生异常,都会执行该方法。 此方法通常用于释放资源、清理工作和处理异常。 release 方法中有三个参数:异常类型、异常实例对象和异常堆栈对象。
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: ,")
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 语句用于创建上下文管理器,但准确地说,这是不正确的。 在前面的示例中,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()
方法。 这样提高了可读性和可维护性,避免了忘记关闭文件导致的资源泄漏问题。
当然,我们也可以自己手动实现文件上下文管理器。
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 提供的一种非常方便的资源管理机制,它可以帮助我们更好地管理和释放资源,简化逻辑,提高鲁棒性,写得更优雅,在项目开发中用起来很舒服。