python上下文管理器

Python中的上下文管理器(Context Manager) 是一种用于自动管理资源(如文件、网络连接、锁等)的机制,确保资源在使用后被正确释放,避免资源泄漏或忘记关闭的问题。核心是通过 with 语句实现。


核心概念

  1. 协议方法

    • __enter__():进入上下文时调用,返回资源对象(如打开的文件)。
    • __exit__():退出上下文时调用,处理资源清理(如关闭文件),并处理异常。
  2. 工作流程

    with 上下文管理器 as 资源对象:
        代码块
    

    等价于:

    资源对象 = 上下文管理器.__enter__()
    try:
        代码块
    finally:
        上下文管理器.__exit__(异常类型, 异常值, 异常栈)
    

使用场景

  1. 文件操作(避免忘记关闭):

    with open("test.txt", "r") as f:  # 自动调用 f.__enter__()
        data = f.read()
    # 退出时自动调用 f.__exit__() 关闭文件
    
  2. 线程锁(确保锁被释放):

    import threading
    lock = threading.Lock()
    with lock:  # 自动获取和释放锁
        # 临界区代码
    
  3. 数据库连接(自动关闭连接):

    with psycopg2.connect(DATABASE_URL) as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users")
    

自定义上下文管理器

方法1:类实现协议

class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file  # 返回资源对象

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()  # 清理资源
        if exc_type:  # 可选:处理异常
            print(f"Error: {exc_val}")
        return False  # 若返回True,则抑制异常

# 使用
with FileManager("log.txt", "w") as f:
    f.write("Hello Context Manager!")

方法2:contextlib 装饰器(更简洁)

from contextlib import contextmanager

@contextmanager
def file_manager(filename, mode):
    try:
        f = open(filename, mode)
        yield f  # 返回资源对象
    finally:
        f.close()  # 确保关闭

# 使用
with file_manager("data.txt", "r") as f:
    print(f.read())

关键优势

  1. 资源安全:自动清理资源(如文件、锁、连接)。
  2. 代码简洁:避免冗余的 try-finally 代码。
  3. 异常处理:在 __exit__() 中统一处理异常。

面试笔记

  • 核心__enter__ + __exit__ 协议。
  • 场景:文件、锁、网络连接、数据库等需释放的资源。
  • 工具:内置类型(如 open())或 contextlib 快速实现。
  • 对比:比手动 try-finally 更简洁安全。
posted @ 2025-08-29 12:00  清澈的澈  阅读(5)  评论(0)    收藏  举报