Skip to content
TechJunior
Menu
  • Đổi mới giáo dục
  • Nuôi dạy con cái
  • Công nghệ và đời sống
  • Thuật ngữ Lập trình
Menu

🚀 DECORATOR TRONG PYTHON – MỞ RỘNG CHỨC NĂNG HÀM MÀ KHÔNG CẦN SỬA CODE! 🐍

Posted on March 18, 2025

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

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • 🔥 Danh Sách Liên Kết Trong C – Hướng Dẫn Toàn Diện Từ Cơ Bản Đến Nâng Cao! 🔥
  • 🔥 Con trỏ trong C – Từ Cơ Bản Đến Nâng Cao🔥
  • XU HƯỚNG NỔI BẬT TRONG ỨNG DỤNG TRÍ TUỆ NHÂN TẠO (AI) TRONG DỊCH THUẬT
  • 10 công cụ AI tốt nhất cho giáo viên trong 2025
  • Unitree G1 – Robot Hình Người Đầu Tiên Có Thể “Bật Tôm”! 🤖🔥

Categories

  • Uncategorized
©2025 TechJunior | Design: Newspaperly WordPress Theme
Menu
  • Đổi mới giáo dục
  • Nuôi dạy con cái
  • Công nghệ và đời sống
  • Thuật ngữ Lập trình