Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách tự viết Context Manager trong Python
Context managers là công cụ hiệu quả để quản lý tài nguyên trong Python, cho phép ta phân bổ và giải phóng tài nguyên một cách chính xác. Context managers đảm bảo rằng tài nguyên sẽ được giải phóng đúng cách ngay cả khi có lỗi xảy ra.
Mở và đóng file với câu lệnh with open()
trong Python
with open('ghi_chu.txt', 'w') as f: f.write('công việc cần làm...')
Trong Python, bạn có thể dễ dàng tự tạo context manager bằng cách sử dụng decorator @contextmanager
từ thư viện contextlib
. Để thực hiện, chỉ cần tạo một hàm và áp dụng các bước sau:
- Sử dụng decorator
@contextmanager
để đánh dấu hàm như một context manager. - Bên trong hàm, sử dụng khối lệnh
try-finally
. - Trong khối
try
, dùng lệnhyield
để cung cấp tài nguyên. - Trong khối
finally
, giải phóng tài nguyên.
Ví dụ trừu tượng dưới đây minh họa cách hoạt động này:
from contextlib import contextmanager @contextmanager def quan_ly_tai_nguyen(*args, **kwargs): # Mã để lấy tài nguyên, ví dụ: resource = acquire_resource(*args, **kwargs) try: yield resource finally: # Mã để giải phóng tài nguyên release_resource(resource)
Khi sử dụng context manager này:
Bài viết này được đăng tại [free tuts .net]
with quan_ly_tai_nguyen(timeout=3600) as resource: # thao tác với tài nguyên
Tự viết Context Manager để mở và đóng File trong Python
from contextlib import contextmanager @contextmanager def mo_file_quan_ly(filename): f = open(filename, 'w') try: yield f finally: f.close() with mo_file_quan_ly('ghi_chu.txt') as f: f.write('công việc cần làm...')
Sử dụng:
with mo_file_quan_ly('ghi_chu.txt') as f: f.write('Công việc cần làm...')
Viết Context Manager bằng Class trong Python
Một cách khác để viết context manager là dùng một lớp với hai phương thức __enter__
và __exit__
. Phương thức __enter__
sẽ thực hiện các thao tác chuẩn bị và trả về tài nguyên, còn __exit__
sẽ giải phóng tài nguyên khi kết thúc.
Ví dụ:
class QuanLyFile: def __init__(self, filename): self.filename = filename def __enter__(self): self.file = open(self.filename, 'w') return self.file def __exit__(self, exc_type, exc_value, traceback): self.file.close() with QuanLyFile('ghi_chu.txt') as f: f.write('Công việc cần làm...')
Kết bài
Context managers giúp mã Python gọn gàng, quản lý tài nguyên hiệu quả và tránh rủi ro thất thoát tài nguyên. Qua các ví dụ trên, bạn có thể linh hoạt tạo context manager tùy theo nhu cầu, đảm bảo ứng dụng của mình vận hành ổn định và tối ưu hơn khi làm việc với tài nguyên.