Bạn đã bao giờ nhìn thấy mã Python với ký hiệu "@login_required" hoặc các ký hiệu tương tự được sử dụng trên đầu một hàm hoặc lớp và tự hỏi về ý nghĩa cũng như mục đích của chúng? Nếu bạn từng làm việc với một framework mà công cụ tài liệu khuyên bạn sử dụng một trình decorator nhất định nhưng bạn không biết cách thực hiện, hay bạn mới làm quen với khái niệm decorator và muốn tìm hiểu sâu hơn, thì bài viết này chính là dành cho bạn.
** Điều kiện tiên quyết trước khi đọc bài viết này:** Bạn nên có kiến thức cơ bản hoặc nâng cao về lập trình Python.
Decorator Là Gì?
Decorator là một trong những kỹ thuật mạnh mẽ và linh hoạt trong Python, cho phép bạn thêm chức năng cho các hàm và lớp mà không cần thay đổi trực tiếp mã nguồn của chúng. Decorator thường được coi là "syntactic sugar" vì chúng làm cho mã dễ đọc hơn và cải thiện cách thức hoạt động của hàm hoặc lớp đó.
Giả sử bạn có một hàm trong một lớp được sử dụng nhiều trong mã của bạn, nhưng có một số chức năng bạn muốn thêm vào mà không ảnh hưởng đến cấu trúc hiện tại. Và bạn cần phải thực hiện điều này mà không làm phá vỡ chức năng của mã nguồn hiện có. Giải pháp tốt nhất trong tình huống này chính là sử dụng decorator.
Như đã đề cập trong phần mở đầu, ví dụ như "@login_required" trong framework Flask là một ứng dụng thực tế của decorator. Khi decorator này được áp dụng lên một hàm, nó sẽ giới hạn quyền truy cập vào hàm đó chỉ cho những người dùng đã đăng nhập. Điều này cho thấy cách thức mà decorator cải thiện ứng dụng phần mềm.
Cách Thức Hoạt Động Của Decorator
Về mặt kỹ thuật, decorator là một hàm nhận một hàm hoặc lớp khác làm đối số, bọc chúng trong một hàm khác để mở rộng hoặc sửa đổi chức năng ban đầu, và cuối cùng trả về một hàm đã được sửa đổi.
Dưới đây là một ví dụ đơn giản để bạn có thể hình dung rõ hơn về cách decorator hoạt động:
python
def hello():
print("Hello readers")
Hàm hello()
định nghĩa một thông điệp và có thể được sử dụng trong nhiều chương trình khác nhau. Giả sử giờ đây bạn muốn thay đổi thông báo mà không cần phải viết lại hàm, bạn có thể sử dụng decorator để làm điều đó.
Bước 1: Định nghĩa hàm decorator của bạn chúng ta gọi là decorator
:
python
def decorator(func):
def wrapper():
print("Trong hàm đã được trang trí")
func()
print("Tạm biệt, rời khỏi hàm đã được trang trí")
return wrapper
Bước 2: Thêm decorator vào hàm hello()
bằng cách sử dụng ký hiệu "@" ở trên cùng của hàm:
python
@decorator
def hello():
print("Hello readers")
Gọi hàm đã được trang trí:
python
hello()
Kết quả:
Trong hàm đã được trang trí
Hello readers
Tạm biệt, rời khỏi hàm đã được trang trí
Kết Luận
Các trình decorator trong Python là công cụ mạnh mẽ cho phép bạn mở rộng hoặc sửa đổi hành vi của các hàm và lớp mà không cần chỉnh sửa mã gốc. Chúng giúp bạn cải thiện và bảo trì mã hiệu quả hơn. Hy vọng qua bài viết này, bạn đã có được cái nhìn sâu sắc hơn về cách hoạt động của decorator trong Python và cách áp dụng nó trong các dự án lập trình của mình. Cảm ơn bạn đã đọc!
source: viblo