- vừa được xem lúc

Hiểu rõ hơn về trình Decorator trong Python

0 0 9

Người đăng: Vinh Phạm

Theo Viblo Asia

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thao tác với File trong Python

Python cung cấp các chức năng cơ bản và phương thức cần thiết để thao tác các file. Bài viết này tôi xin giới thiệu những thao tác cơ bản nhất với file trong Python.

0 0 63

- vừa được xem lúc

Tập tành crawl dữ liệu với Scrapy Framework

Lời mở đầu. Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 demo nho nhỏ.

0 0 166

- vừa được xem lúc

Sử dụng Misoca API (oauth2) với Python

Với bài viết này giúp chúng ta có thể nắm được. ・Tìm hiểu cách xử lý API misoca bằng Python.

0 0 49

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 3)

Tiếp tục phần 2 của series Pandas DataFrame nào. Let's go!!. Ở phần trước, các bạn đã biết được cách lấy dữ liệu một row hoặc column trong Pandas DataFame rồi phải không nào. 6 Hoc.

0 0 63

- vừa được xem lúc

Lập trình socket bằng Python

Socket là gì. Một chức năng khác của socket là giúp các tầng TCP hoặc TCP Layer định danh ứng dụng mà dữ liệu sẽ được gửi tới thông qua sự ràng buộc với một cổng port (thể hiện là một con số cụ thể), từ đó tiến hành kết nối giữa client và server.

0 0 79

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 2)

Nào, chúng ta cùng đến với phần 2 của series Pandas DataFrame. Truy xuất Labels và Data. Bạn đã biết cách khởi tạo 1 DataFrame của mình, và giờ bạn có thể truy xuất thông tin từ đó. Với Pandas, bạn có thể thực hiện các thao tác sau:.

0 0 95