Decorator là một trong những tính năng mạnh và “ma thuật” nhất của Python. Nghe có vẻ khó, nhưng bản chất khá đơn giản: một hàm bọc quanh hàm khác để thêm chức năng.
Ý tưởng cốt lõi
Trong Python, hàm là “công dân hạng nhất” — có thể truyền như tham số, trả về từ hàm khác. Decorator tận dụng điều này.
def in_log(ham):
def bao_boc(*args, **kwargs):
print(f"Đang gọi {ham.__name__}")
ket_qua = ham(*args, **kwargs)
print("Xong")
return ket_qua
return bao_boc
@in_log
def chao(ten):
print(f"Xin chào {ten}")
chao("Minh")
# Đang gọi chao
# Xin chào Minh
# Xong
Ký hiệu @ nghĩa là gì?
@in_log đặt trên hàm chao tương đương với chao = in_log(chao). Nó “bọc” hàm gốc trong hàm mới.
Ứng dụng thực tế
- Đo thời gian chạy của hàm.
- Kiểm tra quyền trước khi thực thi (như trong web framework).
- Lưu cache kết quả (
@functools.lru_cache). - Ghi log tự động.
Ví dụ: đo thời gian
import time
def do_thoi_gian(ham):
def bao_boc(*args, **kwargs):
bd = time.time()
kq = ham(*args, **kwargs)
print(f"Mất {time.time()-bd:.4f}s")
return kq
return bao_boc
Bạn sẽ gặp decorator ở khắp nơi trong Flask, Django, FastAPI. Hiểu nó mở ra một tầng hiểu biết mới về Python.
