Computer >> Máy Tính >  >> Lập trình >> Python

Trình trang trí hàm trong Python?

Các nhà phát triển Python có thể mở rộng và sửa đổi hành vi của một hàm, phương thức hoặc lớp có thể gọi mà không cần sửa đổi vĩnh viễn bản thân có thể gọi bằng cách sử dụng trình trang trí. Tóm lại, chúng ta có thể nói chúng là các đối tượng có thể gọi được dùng để sửa đổi các hàm hoặc lớp.

Trình trang trí hàm là các hàm chấp nhận các tham chiếu hàm làm đối số và thêm một trình bao bọc xung quanh chúng và trả về hàm với trình bao bọc dưới dạng một hàm mới.

Chúng ta hãy hiểu người trang trí chức năng tạm biệt một ví dụ:

Mã1

@decorator
def func(arg):
   return "value"

Đoạn mã trên giống như:

Mã2

def func(arg):
   return "value"
func = decorator(func)

Vì vậy, từ phía trên, chúng ta có thể thấy decorator đơn giản là một hàm khác nhận một hàm làm đối số và trả về một hàm.

Trình trang trí về cơ bản là “decoratre” hoặc “bọc” một hàm khác và cho phép bạn thực thi mã trước và sau khi hàm được bọc chạy như được giải thích trong ví dụ dưới đây:

def our_decorator(func):
   def function_wrapper(x):
      print("Before calling " + func.__name__)
      func(x)
      print("After calling " + func.__name__)
   return function_wrapper

def foo(x):
   print("Hi, foo has been called with " + str(x))

print("We call foo before decoration:")
foo("Hi")

print("We now decorate foo with f:")
foo = our_decorator(foo)

print("We call foo after decoration:")
foo(90)

Đầu ra

We call foo before decoration:
Hi, foo has been called with Hi
We now decorate foo with f:
We call foo after decoration:
Before calling foo
Hi, foo has been called with 90
After calling foo

Nếu bạn nghĩ ở trên hơi phức tạp, hãy viết trình trang trí đơn giản nhất có thể:

def null_decorator(func):
   return func

Ở trên null_decorator là một hàm có thể gọi được (hàm), nó nhận một hàm có thể gọi khác làm đầu vào của nó và nó trả về cùng một đầu vào có thể gọi mà không cần sửa đổi nó.

Hãy mở rộng cách trang trí đơn giản nhất ở trên của chúng ta bằng cách trang trí (hoặc bọc) một chức năng khác.

def null_decorator(func):
   return func
def greet():
   return "Hello, Python!"

greet = null_decorator(greet)
>>> greet()
'Hello, Python!'

Ở trên, chúng tôi đã định nghĩa một hàm chào và sau đó trang trí nó ngay lập tức bằng cách chạy nó thông qua hàm null_decorator.

Cách đơn giản hơn nhiều để viết chương trình trang trí python ở trên (thay vì gọi null_decorator một cách rõ ràng khi chào và sau đó gán lại biến chào) là sử dụng python @syntax để trang trí một hàm trong một bước:

@null_decorator
def greet():
   return "Hello, Python!"
>>> greet()
'Hello, Python!'