Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Decorator Class trong Python
Trong bài viết này, bạn sẽ tìm hiểu về cách sử dụng các class như là decorator trong Python. Sau khi hoàn thành hướng dẫn, bạn sẽ biết cách định nghĩa các class để trang trí và mở rộng hành vi của các hàm một cách linh hoạt và mạnh mẽ hơn. Decorator class cung cấp một cách tiếp cận khác so với việc sử dụng các hàm làm decorator, cho phép bạn tận dụng lợi thế của các thuộc tính và phương thức của class để tạo ra các decorator phức tạp và dễ bảo trì hơn.
Giới thiệu về decorator class trong Python
Trước đây, bạn đã học cách sử dụng các hàm để định nghĩa decorator.
Ví dụ, hàm star
sau đây in ra một số ký tự *
trước và sau khi gọi hàm được trang trí:
def star(n): def decorate(fn): def wrapper(*args, **kwargs): print(n * '*') result = fn(*args, **kwargs) print(result) print(n * '*') return result return wrapper return decorate
Hàm star
là một decorator factory trả về một decorator. Nó chấp nhận một tham số để xác định số lượng ký tự *
cần hiển thị.
Bài viết này được đăng tại [free tuts .net]
Dưới đây là cách sử dụng decorator factory star
:
@star(5) def add(a, b): return a + b add(10, 20)
Kết quả:
***** 30 *****
Decorator factory star()
nhận một tham số và trả về một callable. Callable này nhận một tham số (fn) là hàm sẽ được trang trí. Đồng thời, callable này có thể truy cập tham số (n) được truyền vào decorator factory.
Một instance của class có thể là một callable khi nó implement phương thức __call__
. Vì vậy, bạn có thể sử dụng phương thức __call__
như là một decorator.
Ví dụ sau đây viết lại decorator factory star
bằng cách sử dụng một class:
class Star: def __init__(self, n): self.n = n def __call__(self, fn): def wrapper(*args, **kwargs): print(self.n * '*') result = fn(*args, **kwargs) print(result) print(self.n * '*') return result return wrapper
Bạn có thể sử dụng class Star
như một decorator như sau:
@Star(5) def add(a, b): return a + b
Decorator @Star(5)
trả về một instance của class Star
. Instance này là một callable, vì vậy bạn có thể làm điều tương tự như:
add = Star(5)(add)
Vì vậy, bạn có thể sử dụng các class callable để trang trí các hàm.
Tổng hợp lại:
from functools import wraps class Star: def __init__(self, n): self.n = n def __call__(self, fn): @wraps(fn) def wrapper(*args, **kwargs): print(self.n * '*') result = fn(*args, **kwargs) print(result) print(self.n * '*') return result return wrapper @Star(5) def add(a, b): return a + b add(10, 20)
Kết quả:
***** 30 *****
Kết bài
Sử dụng class như là decorator trong Python mở ra nhiều khả năng và tính linh hoạt trong việc mở rộng và thay đổi hành vi của các hàm mà không cần thay đổi mã gốc của chúng. Bằng cách triển khai phương thức __call__
, bạn có thể tạo ra các decorator mạnh mẽ, dễ bảo trì và tái sử dụng. Hy vọng rằng qua hướng dẫn này, bạn đã nắm vững cách định nghĩa và sử dụng các class như là decorator để nâng cao khả năng lập trình của mình trong Python.