Decorators

Python SELF VI
Mức độ , Bài học
Có sẵn

5.1 Giới thiệu về decorators

Decorators là những hàm nhận hàm khác như một tham số và trả về một hàm mới, thay đổi hoặc mở rộng hành vi của hàm gốc. Decorators được sử dụng để cải thiện khả năng đọc và tái sử dụng mã.

Decorators cho phép điều chỉnh hành vi của các hàm hoặc phương thức mà không cần thay đổi mã nguồn của chúng. Vì vậy, chúng được sử dụng rộng rãi để thêm chức năng, ghi log, kiểm soát truy cập và nhiều tác vụ khác.

Cú pháp decorators trong Python bao gồm việc sử dụng ký hiệu @ trước tên decorator, được đặt trước định nghĩa hàm.


@decorator
def my_function():
    pass

Điều này tương đương với mã sau:


def my_function():
    pass
        
my_function = decorator(my_function)

Nghĩ kỹ xem chuyện gì đang xảy ra ở đây: chúng ta khai báo hàm my_function, nhưng sau đó thay thế nó bằng hàm decorator, nơi mà hàm của chúng ta được truyền vào như một tham số. Hàm decorator có thể gọi hàm của chúng ta theo cách mà nó muốn.

5.2 Tạo một decorator đơn giản

Hãy xem xét một decorator đơn giản, nó in thông báo trước và sau khi gọi hàm.


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
def say_hello():
    print("Hello!")
        
say_hello()

Giải thích

Decorator (my_decorator): Hàm này nhận hàm func làm tham số và trả về một hàm mới wrapper, gọi func và thêm hành vi bổ sung trước và sau khi gọi nó.

Hàm với decorator (say_hello): Hàm say_hello được bọc bởi decorator my_decorator, thêm hành vi bổ sung trong khi gọi nó.

Xuất ra:


# Trước khi gọi hàm
Hello!
# Sau khi gọi hàm

5.3 Decorators với tham số

Decorators có thể nhận tham số, cho phép linh hoạt trong việc tùy chỉnh hành vi của chúng.


def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                func(*args, **kwargs)

        return wrapper
        
    return decorator_repeat
        
@repeat(num_times=3)
def say_hello(name):
    print(f"Hello, {name}!")
        
say_hello("Alice")

Giải thích

Decorator với tham số (repeat): Hàm này nhận tham số num_times và trả về decorator decorator_repeat.

Decorator (decorator_repeat): Decorator này nhận hàm func và trả về một hàm mới wrapper, gọi func num_times lần.

Hàm với decorator (say_hello): Hàm say_hello được gọi ba lần nhờ vào decorator repeat.

Xuất ra:


Hello, Alice!
Hello, Alice!
Hello, Alice!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION