Decorator trong Python là gì? Giải thích dễ hiểu

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.

Lên đầu trang