Trong bài viết này, chúng ta sẽ thấy các decorator mạnh mẽ như thế nào. Nếu bạn chưa quen với Python [và thậm chí nếu bạn chưa biết], có thể bạn chưa bao giờ nghe nói về cấu trúc này. Nó là một cái gì đó cụ thể đối với Python, cho phép xác định một số hành vi chung chung cho nhiều phương thức trong một hàm riêng biệt
Ví dụ: giả sử rằng chúng ta có các phương thức sau
def sum[a, b]:
return a+bdef subtract[a, b]:
return a-b
Bây giờ chúng tôi muốn in kết quả ra bàn điều khiển, trước khi trả lại. Chúng ta nên làm gì? . Nhưng nếu sau đó chúng tôi quyết định lưu nó vào một tệp thì sao?
Thay vào đó, chúng ta có thể tạo một trình trang trí
@log_result2 và thêm nó vào các phương thức
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
@log_result
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Và bây giờ nếu chúng ta muốn thay đổi nơi chúng ta viết đầu ra, chúng ta chỉ cần thay đổi mã bên trong
@log_result2một trang trí là gì?
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Bây giờ chúng ta đã biết cách sử dụng decorator, nhưng chính xác thì decorator là gì?
Để cung cấp cho bạn một định nghĩa chính thức¹,
Trình trang trí là một chức năng nhận một chức năng khác và mở rộng hành vi của chức năng sau mà không sửa đổi nó một cách rõ ràng
Hãy chia nhỏ từng mảnh này
Trước hết, một trình trang trí là một hàm nhận một hàm khác làm tham số. điều này có nghĩa là chúng tôi sẽ định nghĩa trình trang trí
@log_result2 là
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
def log_result[func]:
Sau đó, chúng ta cần sửa đổi chức năng này và trả lại phiên bản đã sửa đổi
Vì vậy, chúng ta có thể tạo một hàm bên trong [mà tôi gọi là
@log_result5 cho đơn giản] thực thi
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
@log_result6 , in ra kết quả và cuối cùng trả về giá trị này________số 8
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Cuối cùng, trình trang trí phải trả lại hàm đã sửa đổi
def log_result[func]:
def inner[]:
res = func[]
print["The result is ", res]
return res
return inner
Chúng tôi đã tạo trang trí đầu tiên của mình. Vâng, không thực sự. Nó chỉ hoạt động nếu chức năng chúng ta thêm vào không có tham số. Ví dụ
@log_result0
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Khi chúng ta gọi hàm này log sẽ in ra màn hình
@log_result1
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Tuy nhiên, nếu chúng tôi cố gắng sử dụng nó với các phương thức
@log_result7 và
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
@log_result8 trước đó, mã sẽ không chạy chính xác
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Vấn đề là chúng ta chưa cung cấp cho hàm đã sửa đổi khả năng nhận các tham số sẽ được chuyển đến
@log_result6. May mắn thay, điều này có thể được giải quyết dễ dàng. Ta sẽ định nghĩa lại
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
@log_result5 như sau
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
@log_result6
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Ghi chú. nếu bạn không biết
def log_result[func]:
1 và def log_result[func]:
2 là gì, hãy xem bài viết nàyGiờ đây,
@log_result5có thể nhận bất kỳ số lượng tham số nào và chuyển trực tiếp chúng vào hàm. Chúng tôi đã thực hiện nó
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
@log_result0Trang trí với các tham số
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Cuối cùng, chúng tôi có thể muốn chuyển một số tham số bổ sung cho trình trang trí. Ví dụ: chúng tôi có thể muốn in cả tên cùng với kết quả để chúng tôi biết nhật ký này đến từ thao tác nào
Để làm như vậy, chúng ta cần sửa đổi một chút chức năng
@log_result1
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Hãy xem chuyện gì đang xảy ra. Hàm
def log_result[func]:
4 lấy chuỗi tên và trả về trình trang trí, sau đó sẽ được áp dụng cho một hàmNó có thể được sử dụng chính xác như trước
@log_result0
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Và kết quả sẽ là
@log_result1Kết luận
def sum[a, b]:
return a+b@log_result
def subtract[a, b]:
return a-b
Cảm ơn bạn đã đọc đến cuối. Dưới đây là một số tài nguyên khác về trang trí
Sơ lược về Python Decorators - Real Python
cập nhật. 22/08/2018. Cập nhật lớn bổ sung thêm nhiều ví dụ và trang trí cao cấp hơn 12/01/2016. Đã cập nhật các ví dụ thành…
trăn thật. com
PEP 318 - Trình trang trí cho các hàm và phương thức
Tài liệu này nhằm mô tả cú pháp của trình trang trí và quy trình dẫn đến các quyết định được đưa ra…
www. con trăn. tổ chức
Thêm nội dung bằng tiếng Anh. io. Đăng ký nhận bản tin hàng tuần miễn phí của chúng tôi. Nhận quyền truy cập độc quyền để viết các cơ hội và lời khuyên trong cộng đồng của chúng tôi Discord