Hầu hết các hướng dẫn đều hiển thị ví dụ tầm thường with open(...) và dừng lại. Đây là ba mẫu mà tôi thực sự sử dụng trong mã thực tế, và chế độ lỗi mà mỗi mẫu ngăn chặn.

Trường hợp 1: Dọn dẹp tài nguyên và xử lý lỗi

Khi bạn có tài nguyên phải dọn dẹp, bất kể điều gì xảy ra:

class DatabaseConnection:
    def __init__(self, config):
        self.config = config
        self.connection = None
    
    def __enter__(self):
        self.connection = create_connection(self.config)
        return self.connection
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.connection:
            self.connection.close()

Tại sao điều này quan trọng

  • Dọn dẹp tài nguyên ngay cả trong trường hợp ngoại lệ
  • Ngăn chặn rò rỉ tài nguyên
  • Làm cho mã đáng tin cậy hơn

Trường hợp 2: Quản lý trạng thái tạm thời

Khi bạn cần thay đổi tạm thời một số trạng thái, sau đó khôi phục nó:

class TempDir:
    def __init__(self, base_path="/tmp"):
        self.base_path = base_path
        self.temp_path = None
    
    def __enter__(self):
        import tempfile
        self.temp_path = tempfile.mkdtemp(dir=self.base_path)
        return self.temp_path
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        import shutil
        if self.temp_path and os.path.exists(self.temp_path):
            shutil.rmtree(self.temp_path)

Tại sao điều này quan trọng

  • Tự động dọn dẹp tệp tạm thời
  • Ngăn chặn lãng phí không gian đĩa
  • Đơn giản hóa xử lý lỗi

Trường hợp 3: Giám sát hiệu suất và thời gian

Khi bạn cần đo thời gian thực thi mã:

import time

class Timer:
    def __enter__(self):
        self.start = time.time()
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end = time.time()
        print(f"Thời gian thực thi: {self.end - self.start:.2f} giây")

Tại sao điều này quan trọng

  • Tự động tính thời gian khối mã
  • Báo cáo thời gian ngay cả trong trường hợp ngoại lệ
  • Dễ dàng giám sát hiệu suất

Điểm chính

  1. Context managers không chỉ dành cho tệp - Chúng áp dụng cho bất kỳ tài nguyên nào cần thiết lập/dọn dẹp
  2. An toàn ngoại lệ - Phương thức __exit__ luôn được gọi, ngay cả trong trường hợp ngoại lệ
  3. Có thể kết hợp - Bạn có thể lồng nhiều context managers
  4. Có thể tái sử dụng - Tạo một lần, sử dụng nhiều lần

Ứng dụng thực tế

Những mẫu này rất hữu ích trong mã thực tế, đặc biệt khi xử lý kết nối cơ sở dữ liệu, tệp tạm thời, kết nối mạng hoặc các thao tác cần thời gian chính xác.

Hãy nhớ: Context managers là con dao quân đội Thụy Sĩ cho quản lý tài nguyên trong Python. Học cách sử dụng chúng sẽ làm cho mã của bạn mạnh mẽ và dễ bảo trì hơn.