Trình trang trí Python: Hàm gói và sửa đổi

Tìm hiểu các trình trang trí Python để sửa đổi hành vi hàm một cách linh hoạt. Hiểu các hàm bao bọc, cú pháp @ và xử lý các đối số trong trình trang trí.

Thử trong Trình chỉnh sửa

Tổng quan

Trình trang trí là một trong những mẫu thiết kế trang nhã và mạnh mẽ nhất của Python. Chúng cho phép các nhà phát triển sửa đổi hoặc mở rộng hành vi của một hàm, phương thức hoặc lớp mà không thay đổi vĩnh viễn mã nguồn của nó. Hãy coi trình trang trí giống như việc gói một hàm bên trong một hàm khác để thực hiện các bước xử lý trước và sau. Điều này làm cho trình trang trí trở nên hoàn hảo để triển khai các mối quan tâm xuyên suốt như ghi nhật ký, định thời gian, xác thực hoặc kiểm soát truy cập.

Về cốt lõi, trình trang trí hoạt động vì các hàm Python là công dân hạng nhất. Điều này có nghĩa là các hàm có thể được truyền dưới dạng đối số cho các hàm khác, được trả về từ các hàm và được gán cho các biến. Trình trang trí chỉ đơn giản là một hàm lấy một hàm khác làm đối số, xác định hàm bao bọc lồng nhau để thực thi hàm ban đầu cùng với một số logic bổ sung và trả về hàm bao bọc này để thay thế hàm ban đầu.

Để làm cho việc áp dụng các trình trang trí trở nên đơn giản và rõ ràng, Python cung cấp đường cú pháp `@designator_name`, được đặt ngay phía trên định nghĩa hàm đích. Thay vào đó, khi gọi hàm được trang trí, Python sẽ gọi trình bao bọc. Nếu hàm chấp nhận các tham số, trình bao bọc phải chấp nhận các đối số tùy ý (`*args` và `**kwargs`) và chuyển tiếp chúng một cách hợp lý. Hiểu các trình trang trí cho phép bạn viết mã có tính mô-đun cao, rõ ràng và DRY (Đừng lặp lại chính mình).

Đầu ra mã & thực thi

Công cụ trang trí tùy chỉnh giúp theo dõi và ghi lại chi tiết thực thi hàm.

def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
Đầu ra thiết bị đầu cuối
Calling multiply with args: (5, 4)
multiply returned: 20

Triển khai từng bước

  • Ghi nhật ký số liệu thời gian chạy vào màn hình hiệu suất
  • Thực thi kiểm tra xác thực và ủy quyền trên các tuyến đường
  • Bộ nhớ đệm hoặc ghi nhớ các kết quả tính toán đắt tiền

Câu hỏi thường gặp

Người trang trí xử lý các đối số như thế nào?

Bằng cách sử dụng *args và **kwargs trong hàm bao bọc lồng nhau, cho phép nó nhận và chuyển tiếp bất kỳ tham số vị trí hoặc từ khóa nào đến hàm được bao bọc.

Bạn có thể áp dụng nhiều trang trí cho một chức năng không?

Có, bạn có thể xếp chúng. Chúng sẽ được thực hiện theo thứ tự từ trên xuống (bọc trong cùng đến ngoài cùng).

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.