Đối số động trang trí python

Python là một ngôn ngữ rất mạnh mẽ, một trong những phần quan trọng nhất của Python that decorator. Trong ngữ cảnh của mẫu thiết kế, ta có thể hiểu decorator là những hàm thay đổi tính năng của một hàm, phương thức hay lớp động một cách, mà không được sử dụng lớp con. Nó rất tiện lợi khi bạn muốn mở rộng tính năng của một chức năng mà bạn không muốn thay đổi nó. Chúng ta có thể triển khai mẫu trang trí ở bất kỳ đâu, nhưng Python tạo điều kiện cho công việc đó bằng cách cung cấp nhưng tính năng và cú pháp vô cùng tiện ích

Trong bài viết này, chúng ta sẽ cùng tìm hiểu về trình trang trí chức năng Python, cùng với một loạt các ví dụ để làm sáng tỏ vấn đề

Về cơ bản, trình trang trí hoạt động như một trình bao bọc, thay đổi hành vi của mã đoạn trước và sau khi chức năng mục tiêu được thực thi mà không phải thay đổi chức năng mục tiêu chính, tăng cường chức năng ban đầu bằng cách trang trí nó

Mọi thứ trong Python đều là đối tượng

Trước khi đi sâu vào decorator, ta cần ôn lại một vài kiến ​​thức về Python. Trong Python, hàm cũng là đối tượng và chúng ta có thể làm được nhiều thứ với hàm

Gán cho nó bằng một biến
def greet[name]:
    return "hello "+name

greet_someone = greet
print greet_someone["John"]

# Outputs: hello John
Định nghĩa hàm trong một hàm khác
def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
Hàm có thể truyền như một tham số đến một hàm khác
def greet[name]:
   return "Hello " + name 

def call_func[func]:
    other_name = "John"
    return func[other_name]  

print call_func[greet]

# Outputs: Hello John
Chức năng có thể trả về một chức năng khác

Nói cách khác chức năng có thể sinh ra một chức năng

def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
Hàm bên trong có quyền truy cập vào tài nguyên trong phạm vi nó thuộc về

Thường được biết đến với cái tên là

def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
0

def compose_greet_func[name]:
    def get_message[]:
        return "Hello there " + name + "!"

    return get_message

greet = compose_greet_func["John"]
print greet[]

# Outputs: Hello there John!

Thành phần của decorator

Trình trang trí chức năng đơn giản là trình bao bọc của một chức năng có sẵn. Kết hợp các tính chất đã được đề cập ở trên lại, chúng ta có thể xây dựng một trang trí

def a_new_decorator[a_func]:

    def wrapTheFunction[]:
        print["I am doing some boring work before executing a_func[]"]

        a_func[]

        print["I am doing some boring work after executing a_func[]"]

    return wrapTheFunction

def a_function_requiring_decoration[]:
    print["I am the function which needs some decoration to remove my foul smell"]

a_function_requiring_decoration[]
#outputs: "I am the function which needs some decoration to remove my foul smell"

a_function_requiring_decoration = a_new_decorator[a_function_requiring_decoration]
#a_function_requiring_decoration được wrap bởi wrapTheFunction

a_function_requiring_decoration[]
#outputs:I am doing some boring work before executing a_func[]
#        I am the function which needs some decoration to remove my foul smell
#        I am doing some boring work after executing a_func[]

Chúng ta vừa áp dụng các quy tắc học bị từ chối. Đây chính xác là những gì decorator làm trong Python. Nó bọc một chức năng và thay đổi cách hoạt động của nó

Cú pháp trang trí Python

Python make work and use decorator trở nên gọn gàng hơn. Để trang trí chức năng

def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
1 chúng ta không cần phải viết
def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
2 thay vào đó chúng ta có thể viết như sau sử dụng cách viết tắt gọn đẹp hơn bằng ký hiệu
def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
3 kèm theo tên của chức năng trang trí phía trên chức năng được trang trí

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
0

Nhưng cách viết này nhiều khi lại không như chúng ta mong muốn, sau khi đã tô chức năng

def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
1, chạy đoạn mã sau

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
2

Giờ đây, chức năng của chúng ta đã được thay thế bởi

def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
5. Nó sẽ ghi đè tên và chuỗi tài liệu của hàm đó. Python đã cung cấp một chức năng giải quyết vấn đề này đó là
def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
6. With change the example before by
def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
6

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
6

Ghi chú.

def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
8 nhận một hàm sẽ được trang trí sao chép cả tên hàm, chuỗi tài liệu, danh sách các tham số,. Nó cho phép truy cập các thuộc tính của chức năng trước khi chức năng được trang trí

Bây giờ chúng ta sẽ áp dụng cùng một công cụ trang trí vào một số trường hợp sử dụng

Trường hợp sử dụng

ủy quyền

Người trang trí có thể giúp kiểm tra một người đã được ủy quyền để sử dụng một điểm cuối bất kỳ trên web ứng dụng. Nó được sử dụng rất rộng rãi trong framework Flask hay Django của Python. Sau đây là một ví dụ xác thực dựa trên việc sử dụng decorator

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
8

ghi nhật ký

Ghi nhật ký là một ví dụ khác có thể sử dụng trang trí

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
0

Sử dụng decorator với tham số

Nếu chú ý, chúng ta có thể thấy

def compose_greet_func[]:
    def get_message[]:
        return "Hello there!"

    return get_message

greet = compose_greet_func[]
print greet[]

# Outputs: Hello there!
9 cũng là một vật trang trí, nhưng nó được truyền vào một tham số như những chức năng khác. Khi chúng ta sử dụng cú pháp
def compose_greet_func[name]:
    def get_message[]:
        return "Hello there " + name + "!"

    return get_message

greet = compose_greet_func["John"]
print greet[]

# Outputs: Hello there John!
0, chúng ta gọi một hàm bao bọc với một chức năng như một tham số. Với Python, tất cả đều là đối tượng, kể cả hàm, chúng ta có thể viết một hàm trả về một hàm bao bọc

Viết trang trí bên trong một chức năng

Quay trở lại với ví dụ về ghi nhật ký và tạo trình bao bọc cho phép chúng ta xác định đầu ra tệp nhật ký

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
1

lớp trang trí

Bây giờ chúng ta đã có logit decorator, nhưng đôi khi trong ứng dụng của chúng ta có một vài thành phần nguy hiểm, và lỗi xảy ra ở những phần đó cần được chú ý đến ngay lập tức khi nó bắt đầu xảy ra. Ví dụ: khi chúng ta muốn ghi nhật ký ra tệp, nhưng với những lỗi nghiêm trọng, chúng ta muốn gửi thư, nhưng vẫn giữ nguyên nhật ký cho phép theo dõi. Đây là một trường hợp chúng ta có thể sử dụng để kế thừa

May mắn là với Python, class cũng có thể được sử dụng để build decorator. Chúng ta sẽ xây dựng lại lớp logit thay vì chức năng

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
2

Cách triển khai này nhìn gọn gàng hơn cách viết hàm lồng nhau trả về hàm bao bọc và cách hàm bao bọc với trình trang trí vẫn sử dụng cú pháp như cũ

def greet[name]:
    def get_message[]:
        return "Hello "

    result = get_message[]+name
    return result

print greet["John"]

# Outputs: Hello John
3

Bây giờ chúng ta có thể kế thừa lớp logit và thêm chức năng gửi thư bằng cách ghi đè hàm

def compose_greet_func[name]:
    def get_message[]:
        return "Hello there " + name + "!"

    return get_message

greet = compose_greet_func["John"]
print greet[]

# Outputs: Hello there John!
1

Chủ Đề