Bạn đã bao giờ bắt gặp một cơ sở mã Python trong đó "@login_required" hoặc dấu "@" được sử dụng với bất kỳ hậu tố nào khác ở trên một hàm hoặc lớp và bạn ngay lập tức tự hỏi đó là gì hoặc mục đích của nó là gì không?
Hoặc trước đây bạn đã từng sử dụng một framework mà tài liệu hướng dẫn nói rằng bạn nên sử dụng một trình decorator nhất định để đạt được chức năng cụ thể nhưng bạn không biết cách triển khai như thế nào và muốn tìm hiểu?
Hoặc có thể bạn mới làm quen với khái niệm decorator và muốn tìm hiểu về nó, vậy hãy khám phá rõ hơn trong bài viết này nhé.
Điều kiện tiên quyết trước khi đọc bài viết này: Bạn cần có kiến thức cơ bản hoặc nâng cao về lập trình trên Python.
Decorator là gì?
Decorator được sử dụng trong Python để cung cấp thêm chức năng cho các lớp và hàm mà không làm thay đổi cấu trúc mã ban đầu của lớp hoặc hàm đó tùy từng trường hợp. Decorator đôi khi được gọi là "syntactic sugar" vì chúng có xu hướng cải thiện hành vi của lớp hoặc hàm.
Nếu bạn bị mắc kẹt trong tình huống mà bạn có một hàm của lớp được đóng gói với một số chức năng nhất định đã được sử dụng bởi một phần lớn hơn của chương trình hoặc phần mềm của bạn, tùy từng trường hợp, và bạn muốn lớp/hàm đó có một chút sửa đổi cho mục đích sử dụng dự định trong chương trình, đồng thời bạn không muốn phá vỡ chức năng của cơ sở mã hiện có vì chúng được kết hợp chặt chẽ như thế nào với nhau, thì bạn nghĩ cách tiếp cận tốt nhất trong tình huống này là gì?
Bạn đoán đúng rồi đó, tất cả những gì bạn cần làm là decorator lớp/hàm đó để đạt được chức năng mong muốn mà không phá vỡ chương trình hiện có nơi chúng đang được sử dụng.
Giống như đã nêu trong phần đầu của bài viết, trong đó "@login_required" được sử dụng để trích dẫn một trường hợp, thì đó thực sự là một trình decorator được sử dụng trong framework Flask, tình cờ là một framework phụ trợ phổ biến, bất cứ khi nào trình framework "@login_required" được đặt trên đầu một hàm xem, nó khiến quyền truy cập vào hàm xem bị hạn chế chỉ dành cho những người dùng đã xác thực/đăng nhập vào ứng dụng. Một lần nữa, chúng ta thấy được ứng dụng thực tế của trình decorator và cách sử dụng nó trong việc xây dựng phần mềm.
Theo góc nhìn kỹ thuật và ở cấp độ thấp hơn, trình decorator là tập hợp các hàm lấy các hàm hoặc lớp khác làm đối số rồi gói chúng trong một hàm bao bọc mở rộng/sửa đổi chức năng của chúng, sau đó hàm decorator trả về kết quả của sửa đổi được thực hiện bởi hàm bao bọc.
Đống kiến thức trên nghe có vẻ lằng nhằng nhỉ, sau đây là một số đoạn mã giúp bạn có thể hiểu rõ hơn:
def hello(): print("Hello readers")
hello() là một hàm được định nghĩa để hiển thị "Hello readers" bất cứ khi nào nó được gọi và nó có thể đã được sử dụng trong phần lớn các chương trình, phần mềm của tôi.
Và bây giờ tôi cần sửa đổi thông báo hiển thị từ hàm hello mà không cần định nghĩa hàm mới một cách rõ ràng trong chương trình của mình, tôi có thể áp dụng decorator cho hàm hello() để đạt được kết quả sửa đổi mong muốn chỉ bằng cách sử dụng trình decorator.\
Bước đầu tiên đó là xác định hàm decorator của bạn:
def decorator(func): def wrapper(): print("in the decorated function") func() print("bye, leaving the decorated function") return wrapper
Bước thứ hai và cũng là bước cuối cùng đó là đặt hàm decorator làm hậu tố cho ký hiệu "@" ở trên cùng của hàm cần decorator.
@decorator
def hello(): print("Hello readers") # Calling the decorated function
hello() This outputs: in the decorated function Hello readers bye, leaving the decorated function
Tóm lại, các trình decorator trong Python sửa đổi hành vi của các hàm và lớp mà không làm thay đổi cấu trúc của đoạn mã đã xác định, do đó cải thiện một số hành vi nhất định của lớp hoặc hàm, tùy từng trường hợp. Thực sự không hề khó hiểu phải không nào? Cảm ơn các bạn đã theo dõi.