CÔNG CỤ
MODULES
THAM KHẢO
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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ùng chuyên mục:

Tìm hiểu về Deque trong Python

Tìm hiểu về Deque trong Python

Đổi tên File trong Python

Đổi tên File trong Python

File Organizing trong Python

File Organizing trong Python

Tìm hiểu Mô-đun statistics Trong Python

Tìm hiểu Mô-đun statistics Trong Python

Cách giới hạn float values trong Python

Cách giới hạn float values trong Python

Mô-đun base64 trong Python

Mô-đun base64 trong Python

Lập trình Socket trong Python

Lập trình Socket trong Python

Tìm hiểu về các phép toán Groupby trong Pandas

Tìm hiểu về các phép toán Groupby trong Pandas

Cách áp dụng ngưỡng hình ảnh trong Python với NumPy

Cách áp dụng ngưỡng hình ảnh trong Python với NumPy

10 tip One Liner bạn cần biết trong Python

10 tip One Liner bạn cần biết trong Python

Cách gỡ lỗi ứng dụng Python trong Docker Container bằng VS Code

Cách gỡ lỗi ứng dụng Python trong Docker Container bằng VS Code

Cách đảo ngược Chuỗi String trong Python

Cách đảo ngược Chuỗi String trong Python

6 Tip viết vòng lặp For hiệu quả hơn trong Python

6 Tip viết vòng lặp For hiệu quả hơn trong Python

Các nền tảng lưu trữ tốt nhất cho ứng dụng và script Python

Các nền tảng lưu trữ tốt nhất cho ứng dụng và script Python

Cách tạo hằng số trong Python

Cách tạo hằng số trong Python

Cách lên lịch chạy script Python bằng GitHub Actions

Cách lên lịch chạy script Python bằng GitHub Actions

Cách sắp xếp dictionary theo giá trị trong Python

Cách sắp xếp dictionary theo giá trị trong Python

Cách kiểm tra List trống trong Python

Cách kiểm tra List trống trong Python

Cách sao chép danh sách (List) trong Python

Cách sao chép danh sách (List) trong Python

Cách đo Time chạy trong Python

Cách đo Time chạy trong Python

Top