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:

Cách dừng Luồng trong Python

Cách dừng Luồng trong Python

Cách sử dụng Semaphore trong Python

Cách sử dụng Semaphore trong Python

Đối tượng Threading Event trong Python

Đối tượng Threading Event trong Python

Tìm hiểu về điều kiện race của threading Lock trong Python

Tìm hiểu về điều kiện race của threading Lock trong Python

Sử dụng lớp ThreadPoolExecutor trong Python

Sử dụng lớp ThreadPoolExecutor trong Python

Các luồng Daemon trong Python

Các luồng Daemon trong Python

Tìm hiểu về Multithreading trong Python

Tìm hiểu về Multithreading trong Python

Cách trả về giá trị từ một Thread trong Python

Cách trả về giá trị từ một Thread trong Python

Cách mở rộng Class Thread trong Python

Cách mở rộng Class Thread trong Python

Cách sử dụng module threading trong Python

Cách sử dụng module threading trong Python

Sự khác biệt giữa các Processes and Threads

Sự khác biệt giữa các Processes and Threads

Tài liệu tham khảo nhanh về Regex trong Python

Tài liệu tham khảo nhanh về Regex trong Python

Hàm Flags của Regex trong Python

Hàm Flags của Regex trong Python

Hàm split() của Regex trong Python

Hàm split() của Regex trong Python

Hàm finditer() của Regex trong Python

Hàm finditer() của Regex trong Python

Hàm fullmatch() của Regex trong Python

Hàm fullmatch() của Regex trong Python

Hàm match() của Regex trong Python

Hàm match() của Regex trong Python

Hàm sub() của Regex trong Python

Hàm sub() của Regex trong Python

Hàm search() trong Python Regex

Hàm search() trong Python Regex

Hàm findall() của regex trong Python

Hàm findall() của regex trong Python

Top