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 tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Sử dụng PyQt QComboBox để tạo Widget Combobox

Sử dụng PyQt QComboBox để tạo Widget Combobox

Cách sử dụng lớp PyQt QRadioButton

Cách sử dụng lớp PyQt QRadioButton

Cách sử dụng lớp QCheckBox trong PyQt

Cách sử dụng lớp QCheckBox trong PyQt

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget PyQt QLabel

Cách sử dụng widget PyQt QLabel

Tín hiệu và Khe (Signals & Slots) trong PyQt

Tín hiệu và Khe (Signals & Slots) trong PyQt

PyQt là gì? Tạo một chương trình

PyQt là gì? Tạo một chương trình "Hello World".

Ứng dụng System Tray với Tkinter

Ứng dụng System Tray với Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách sử dụng Validate trong Tkinter

Cách sử dụng Validate trong Tkinter

Cấu trúc MVC trong Tkinter

Cấu trúc MVC trong Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Top