Một decorator là một hàm bao bọc một hàm khác để thêm hành vi, mà không sửa đổi code của hàm gốc. Nó được áp dụng bằng cú pháp @decorator phía trên một hàm — một cách gọn gàng để thêm các mối quan tâm xuyên suốt (cross-cutting concern) như logging, đo thời gian, caching hoặc kiểm soát truy cập.
Decorator hoạt động như thế nào
():
():
()
result = func(*args, **kwargs)
()
result
wrapper
():
()
greet()
