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.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng