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
- 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
- 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ệ - Có thể kết hợp - Bạn có thể lồng nhiều context managers
- 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.