
Bạn đã bao giờ muốn thêm tính năng cho một hàm mà không cần sửa đổi code gốc chưa? 🤔 Điều này rất quan trọng trong lập trình vì nếu sửa code gốc quá nhiều, chương trình có thể trở nên khó bảo trì và dễ gặp lỗi.
🔹 Bạn muốn đo thời gian thực thi của một hàm?
🔹 Bạn muốn kiểm tra quyền truy cập trước khi chạy một hàm?
🔹 Bạn muốn ghi log mỗi khi một hàm được gọi?
Tất cả những điều trên có thể được thực hiện một cách dễ dàng nhờ Decorator! 🚀
🎯 1. Decorator là gì?
Decorator trong Python là một kỹ thuật mạnh mẽ giúp bạn mở rộng hoặc chỉnh sửa hành vi của hàm mà không cần thay đổi nội dung bên trong nó.
💡 Nói đơn giản: Decorator là một hàm nhận một hàm khác làm tham số, sau đó thêm chức năng cho hàm đó và trả về một hàm mới.
🛠 Cách hoạt động của Decorator
1️⃣ Hàm gốc vẫn giữ nguyên.
2️⃣ Decorator nhận hàm gốc làm tham số.
3️⃣ Decorator thực hiện một số thao tác bổ sung.
4️⃣ Hàm mới được trả về và có thêm chức năng mới.
Ví dụ đơn giản về decorator:
def my_decorator(func):
def wrapper():
print("Trước khi gọi hàm")
func()
print("Sau khi gọi hàm")
return wrapper
@my_decorator # Áp dụng decorator
def say_hello():
print("Xin chào!")
say_hello()
💡 Kết quả:
Trước khi gọi hàm
Xin chào!
Sau khi gọi hàm
📌 Decorator giúp bạn thêm chức năng vào say_hello()
mà không cần thay đổi code gốc!
🎯 2. Tại sao cần Decorator?
Decorator giúp bạn viết code gọn hơn, dễ bảo trì hơn và giúp tránh lặp code.
🔹 Thay vì thêm cùng một đoạn code vào nhiều hàm, bạn chỉ cần viết một decorator và áp dụng nó.
🔹 Decorator giúp code dễ đọc hơn vì bạn có thể hiểu ngay rằng một hàm đã được mở rộng mà không cần kiểm tra từng dòng code bên trong.
🔹 Dễ dàng bật/tắt các chức năng mở rộng bằng cách thêm hoặc gỡ bỏ dòng @decorator_name
.
💡 Ứng dụng thực tế của Decorator:
✅ Ghi log mỗi lần hàm được gọi
✅ Đo thời gian thực thi của hàm
✅ Kiểm tra quyền truy cập
✅ Xử lý lỗi tự động
✅ Lưu cache kết quả để tăng tốc
🎯 3. Cách tạo Decorator trong Python
🛠 Cấu trúc cơ bản của một Decorator
def decorator_name(func):
def wrapper(*args, **kwargs):
# Thực hiện một số thao tác trước khi gọi hàm gốc
result = func(*args, **kwargs)
# Thực hiện một số thao tác sau khi gọi hàm gốc
return result
return wrapper
💡 Giải thích:
🔹 func
là hàm gốc.
🔹 wrapper
là hàm bọc (hàm này thực hiện chức năng mở rộng).
🔹 *args, **kwargs
giúp decorator có thể hoạt động với bất kỳ hàm nào.
🔹 Cuối cùng, wrapper
được trả về để thay thế hàm gốc.
🎯 4. Ví dụ Thực Tế về Decorator
📌 Ví dụ 1: Ghi log khi gọi hàm
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Đang gọi hàm {func.__name__} với các tham số {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"Hàm {func.__name__} đã chạy xong")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
print(add(5, 10))
💡 Kết quả:
Đang gọi hàm add với các tham số (5, 10), {}
Hàm add đã chạy xong
15
📌 Ví dụ 2: Đo thời gian thực thi của một hàm
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Hàm {func.__name__} chạy trong {end_time - start_time:.4f} giây")
return result
return wrapper
@timer_decorator
def slow_function():
time.sleep(2)
print("Hàm chạy xong!")
slow_function()
💡 Kết quả:
Hàm chạy xong!
Hàm slow_function chạy trong 2.0001 giây
📌 Ví dụ 3: Kiểm tra quyền truy cập
def permission_required(func):
def wrapper(*args, **kwargs):
user = kwargs.get("user", "guest")
if user != "admin":
print("Bạn không có quyền truy cập!")
return
return func(*args, **kwargs)
return wrapper
@permission_required
def delete_file(file_name, user="guest"):
print(f"File {file_name} đã bị xóa!")
delete_file("data.txt", user="admin") # Thành công
delete_file("data.txt", user="guest") # Bị chặn
💡 Kết quả:
File data.txt đã bị xóa!
Bạn không có quyền truy cập!
🎯 5. Sử dụng nhiều Decorator cùng lúc
Python cho phép bạn áp dụng nhiều decorator lên cùng một hàm!
@log_decorator
@timer_decorator
def example():
time.sleep(1)
print("Ví dụ chạy xong!")
example()
💡 Kết quả:
Đang gọi hàm example với các tham số (), {}
Ví dụ chạy xong!
Hàm example chạy trong 1.0002 giây
Hàm example đã chạy xong
📌 Lưu ý: Decorator được gọi từ dưới lên trên (trước tiên timer_decorator
, sau đó log_decorator
).
🎯 6. Kết luận
🔹 Decorator là một công cụ mạnh mẽ giúp mở rộng chức năng của hàm mà không cần thay đổi nội dung gốc.
🔹 Decorator giúp code sạch hơn, dễ bảo trì hơn, và tránh lặp code.
🔹 Được sử dụng rộng rãi trong logging, kiểm tra quyền, đo thời gian thực thi, caching, xử lý lỗi…
🔹 Có thể kết hợp nhiều decorator để tạo ra các hàm mạnh mẽ và linh hoạt hơn.
🎯 Hãy thử áp dụng Decorator ngay hôm nay để tối ưu hóa code của bạn! 🚀
Bạn đã từng sử dụng Decorator chưa? Hãy chia sẻ cảm nhận của bạn trong phần bình luận! ⬇️💬
#Python #Decorator #LapTrinhPython #PythonTips #CodeOptimization