Hướng dẫn uses of decorators in python - sử dụng decorator trong python

Trang trí trong Python

Python có một tính năng thú vị gọi là các nhà trang trí để thêm chức năng vào một mã hiện có.decorators to add functionality to an existing code.

Điều này cũng được gọi là metaprogramming vì một phần của chương trình cố gắng sửa đổi một phần khác của chương trình tại thời điểm biên dịch.metaprogramming because a part of the program tries to modify another part of the program at compile time.


Điều kiện tiên quyết cho các nhà trang trí học tập

Để hiểu về các nhà trang trí, trước tiên chúng ta phải biết một vài điều cơ bản trong Python.

Chúng ta phải thoải mái với thực tế là mọi thứ trong Python (vâng! Ngay cả các lớp học), là đối tượng. Tên mà chúng tôi xác định chỉ đơn giản là các định danh bị ràng buộc với các đối tượng này. Các hàm không phải là ngoại lệ, chúng cũng là đối tượng (với các thuộc tính). Các tên khác nhau có thể được liên kết với cùng một đối tượng chức năng.

Đây là một ví dụ.

def first(msg):
    print(msg)


first("Hello")

second = first
second("Hello")

Đầu ra

Hello
Hello

Khi bạn chạy mã, cả hai chức năng

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
3 và
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
4 cung cấp cùng một đầu ra. Ở đây, các tên
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
3 và
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
4 đề cập đến cùng một đối tượng hàm.

Bây giờ mọi thứ bắt đầu trở nên kỳ quặc hơn.

Các chức năng có thể được truyền dưới dạng đối số cho một chức năng khác.

Nếu bạn đã sử dụng các hàm như

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
7,
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
8 và
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
9 trong Python, thì bạn đã biết về điều này.

Các chức năng như vậy lấy các chức năng khác làm đối số còn được gọi là các hàm bậc cao hơn. Dưới đây là một ví dụ về một chức năng như vậy.higher order functions. Here is an example of such a function.

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result

Chúng tôi gọi các chức năng như sau.

>>> operate(inc,3)
4
>>> operate(dec,3)
2

Hơn nữa, một hàm có thể trả về một chức năng khác.

def is_called():
    def is_returned():
        print("Hello")
    return is_returned


new = is_called()

# Outputs "Hello"
new()

Đầu ra

Hello

Hello
Hello

Khi bạn chạy mã, cả hai chức năng

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
3 và
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
4 cung cấp cùng một đầu ra. Ở đây, các tên
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
3 và
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
4 đề cập đến cùng một đối tượng hàm.


Bây giờ mọi thứ bắt đầu trở nên kỳ quặc hơn.

Các chức năng có thể được truyền dưới dạng đối số cho một chức năng khác.callable as they can be called.

Nếu bạn đã sử dụng các hàm như

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
7,
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
8 và
def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
9 trong Python, thì bạn đã biết về điều này.

Các chức năng như vậy lấy các chức năng khác làm đối số còn được gọi là các hàm bậc cao hơn. Dưới đây là một ví dụ về một chức năng như vậy.

def make_pretty(func):
    def inner():
        print("I got decorated")
        func()
    return inner


def ordinary():
    print("I am ordinary")

Chúng tôi gọi các chức năng như sau.

>>> ordinary()
I am ordinary

>>> # let's decorate this ordinary function
>>> pretty = make_pretty(ordinary)
>>> pretty()
I got decorated
I am ordinary

Hơn nữa, một hàm có thể trả về một chức năng khác.

pretty = make_pretty(ordinary)

Ở đây,

>>> operate(inc,3)
4
>>> operate(dec,3)
2
0 là một hàm lồng nhau được xác định và trả về mỗi lần chúng tôi gọi
>>> operate(inc,3)
4
>>> operate(dec,3)
2
1.

Cuối cùng, chúng ta phải biết về việc đóng cửa trong Python.

Trở lại với các nhà trang trí

ordinary = make_pretty(ordinary).

Các chức năng và phương thức được gọi là có thể gọi vì chúng có thể được gọi.

Trong thực tế, bất kỳ đối tượng nào thực hiện phương thức

>>> operate(inc,3)
4
>>> operate(dec,3)
2
2 đặc biệt đều được gọi là có thể gọi được. Vì vậy, theo nghĩa cơ bản nhất, một người trang trí là một người có thể gọi được trả về một người có thể gọi được.

Hello
Hello
0

Về cơ bản, một người trang trí có chức năng, thêm một số chức năng và trả lại nó.

Hello
Hello
1

Khi bạn chạy các mã sau trong shell,


Trong ví dụ được hiển thị ở trên, >>> operate(inc,3) 4 >>> operate(dec,3) 23 là một người trang trí. Trong bước chuyển nhượng:

Hàm

>>> operate(inc,3)
4
>>> operate(dec,3)
2
4 được trang trí và hàm trả về được đặt tên
>>> operate(inc,3)
4
>>> operate(dec,3)
2
5.

Hello
Hello
2

Chúng ta có thể thấy rằng chức năng trang trí đã thêm một số chức năng mới vào chức năng ban đầu. Điều này tương tự như đóng gói một món quà. Các nhà trang trí hoạt động như một trình bao bọc. Bản chất của đối tượng được trang trí (món quà thực tế bên trong) không thay đổi. Nhưng bây giờ, nó trông rất đẹp (vì nó đã được trang trí).

Hello
Hello
3

Nói chung, chúng tôi trang trí một chức năng và gán lại nó là,

Hello
Hello
4

Đây là một cấu trúc phổ biến và vì lý do này, Python có một cú pháp để đơn giản hóa điều này.

Hello
Hello
5

Chúng ta có thể sử dụng biểu tượng

>>> operate(inc,3)
4
>>> operate(dec,3)
2
6 cùng với tên của hàm trang trí và đặt nó lên trên định nghĩa của hàm được trang trí. Ví dụ,

tương đương với

Đây chỉ là một đường cú pháp để thực hiện trang trí.

Hello
Hello
6

Chức năng trang trí với các thông số

Các nhà trang trí trên rất đơn giản và nó chỉ hoạt động với các chức năng không có bất kỳ thông số nào. Điều gì sẽ xảy ra nếu chúng ta có các chức năng có trong các tham số như:

Hàm này có hai tham số, a và b. Chúng tôi biết nó sẽ gây ra lỗi nếu chúng tôi vượt qua B là 0.

Hello
Hello
7

Đầu ra

Hello
Hello
8

Hello
Hello

Hello
Hello
9

Về cơ bản, một người trang trí có chức năng, thêm một số chức năng và trả lại nó.

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
0

Khi bạn chạy các mã sau trong shell,

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
1

Trong ví dụ được hiển thị ở trên,

>>> operate(inc,3)
4
>>> operate(dec,3)
2
3 là một người trang trí. Trong bước chuyển nhượng:

def inc(x):
    return x + 1


def dec(x):
    return x - 1


def operate(func, x):
    result = func(x)
    return result
2

Ưu điểm của các nhà trang trí trong Python là gì?

Một người trang trí trong Python là một chức năng lấy một chức năng khác làm đối số của nó và trả về một chức năng khác.Các nhà trang trí có thể cực kỳ hữu ích vì chúng cho phép mở rộng chức năng hiện có, mà không có bất kỳ sửa đổi nào đối với mã nguồn chức năng ban đầu.allow the extension of an existing function, without any modification to the original function source code.

Chức năng trang trí là gì?

Theo định nghĩa, một bộ trang trí là một hàm có một chức năng khác và mở rộng hành vi của hàm sau mà không sửa đổi rõ ràng nó.a function that takes another function and extends the behavior of the latter function without explicitly modifying it.

Các nhà trang trí có hữu ích không?

Chúng không chỉ có thể được sử dụng để làm chậm thời gian cần thiết để viết một số mã, mà chúng còn có thể cực kỳ hữu ích trong việc tăng tốc mã.Không chỉ là những người trang trí cực kỳ hữu ích khi bạn tìm thấy chúng, mà còn là một ý tưởng tuyệt vời để viết của riêng bạn.. Not only are decorators incredibly useful when you find them about, but it is also a great idea to write your own.