Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python

Tránh lặp lại Code Python của bạn Với Decorator

by
Length:MediumLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Decorator là một trong những tính năng tuyệt vời nhất của Python, tuy nhiên đối với người mới bắt đầu lập trình Python, chúng có vẻ như là phép thuật vậy. Mục đích của bài viết này là để tìm hiểu sâu cơ chế đằng sau các decoration trong Python.

Đây là những gì bạn sẽ được học:

  • decorator trong Python là gì và tác dụng của chúng
  • cách định nghĩa các decorator của riêng chúng ta
  • các ví dụ decorator thực tế và cách chúng hoạt động
  • cách để viết code tốt hơn bằng decorator

Giới thiệu

Trong trường hợp bạn chưa từng thấy (hoặc có lẽ bạn không biết bạn đang làm việc với nó), các decorator sẽ giống như thế này:

Bạn thường gặp chúng ở trên định nghĩa của một hàm, và chúng có tiền tố @. Các decorator đặc biệt hữu ích trong việc giữ code của bạn không bị lặp lại (hay còn gọi là DRY), và chúng làm điều đó nhưng đồng thời cũng cải thiện khả năng đọc của code.

Vẫn còn mập mờ? Không phải vậy chứ, vì decorator chỉ là các hàm Python. Đúng rồi! Bạn đã biết cách tạo ra một hàm. Trong thực tế, nguyên tắc cơ bản đằng sau decorator là hàm phức hợp. Hãy lấy một ví dụ:

Điều gì sẽ xảy ra nếu chúng ta muốn tạo ra một hàm khác, hàm x_plus_2_squared? Cố gắng tổ hợp các hàm sẽ là vô nghĩa:

Bạn không thể tổ hợp các hàm bằng cách này bởi vì cả hai hàm đều nhận các con số như là các đối số. Tuy nhiên, cái này sẽ hoạt động:

Hãy định nghĩa lại cách hàm x_squared làm việc. Nếu chúng ta muốn x_squared có thể tái tổ hợp theo mặc định, nó nên:

  1. Chấp nhận một hàm như một đối số
  2. Trả về một hàm khác

Chúng ta sẽ đặt tên phiên bản có thể tái tổ hợp của x_squared đơn giản là squared.

Bây giờ chúng ta đã định nghĩa hàm squared theo cách làm cho nó có thể tái tổ hợp, chúng ta có thể sử dụng nó với bất kỳ hàm nào khác. Dưới đây là một số ví dụ:

Chúng ta có thể nói rằng hàm squared decorate các hàm x_plus_2, x_plus_3x_times_2. Chúng ta ở rất gần ký hiệu tiêu chuẩn của decorator. Hãy xem:

Xong rồi! x_plus_2 là một hàm decorator phù hợp. Đây là nơi ký hiệu @ được đặt đúng vị trí:

Trong thực tế, ký hiệu @ là một hình thức cú pháp dễ đọc. Hãy thử điều đó:

Nếu squared là decorator đầu tiên mà bạn viết, hãy tự thưởng cho mình. Bạn đã nắm được một trong những khái niệm phức tạp nhất trong Python. Trong quá trình tìm hiểu, bạn đã học được một tính năng cơ bản của ngôn ngữ lập trình hàm: tổ hợp hàm.

Xây dựng Decorator của riêng bạn

Một decorator là một hàm nhận một hàm như là một đối số và trả về một hàm khác. Mặc dù vậy, hình thức chung cho việc định nghĩa decorator là:

Trong trường hợp bạn không biết, bạn có thể định nghĩa các hàm bên trong các hàm khác. Trong hầu hết các trường hợp, decorated_function sẽ được định nghĩa bên trong decorator.

Hãy nhìn vào một ví dụ thực tế hơn:

Tuyệt! Bây giờ bạn có thể chắc chắn rằng mọi thứ bên trong ứng dụng của bạn đã được chuẩn hóa cho múi giờ UTC.

Một Ví dụ Thực tế

Một trường hợp sử dụng rất phổ biến và rất kinh điển khác đối với decorator là lưu cache kết quả của một hàm:

Nếu bạn nhìn sơ qua code, bạn có thể thấy khó chịu. Decorator không thể sử dụng lại được! Nếu chúng ta decorate một hàm khác (gọi là another_complex_computation) và gọi nó với các tham số tương tự thì chúng ta sẽ nhận được các kết quả được cache từ hàm complex_computation. Điều này sẽ không xảy ra. Decorator có thể sử dụng lại và đây là lý do:

Hàm chached được gọi một lần cho mỗi hàm mà nó decorate, do đó, một biến _cache khác được khởi tạo mỗi lần và tồn tại trong ngữ cảnh đó. Hãy thử điều đó:

Decorator trong Thực tế

Decorator mà chúng ta vừa mớ viết, như bạn có thể nhận thấy, rất hữu ích. Nó hữu ích đến nỗi một phiên bản phức tạp và mạnh mẽ hơn đã tồn tại trong mô đun functools tiêu chuẩn. Nó được đặt tên là lru_cache. LRU là viết tắt của Least Recently Used, một chiến lược cahe.

Một trong những trường hợp sử dụng decorator yêu thích của tôi là trong framework Flask. Nó thì gọn gàng, đó là đoạn code điều đầu tiên bạn nhìn thấy trên trang web Flask. Đây là đoạn code đó:

Decorator app.route gán hàm hello làm trình xử lý yêu cầu cho tuyến "/". Thật sự đơn giản.

Một cách sử dụng decorator gọn gàng khác là bên trong Django. Thông thường, các ứng dụng web có hai kiểu trang:

  1. các trang bạn có thể xem mà không cần chứng thực (trang chủ, trang landing, bài blog, đăng nhập, đăng ký)
  2. các trang bạn cần phải được chứng thực để xem (cài đặt tiểu sử, hộp thư đến, bảng điều khiển)

Nếu bạn thử xem một kiểu trang thứ hai, bạn thường sẽ được chuyển hướng đến một trang đăng nhập. Dưới đây là cách thực hiện điều đó trong Django:

Quan sát xem các chế độ view riêng tư gọn gàng như thế nào được đánh dấu bằng login_required. Khi xem qua code, nó rất rõ ràng đối với người đọc mà các trang yêu cầu người dùng đăng nhập và những trang không yêu cầu.

Phần tóm tắt

Tôi hy vọng bạn đã có một buổi học thú vị về decorator bởi vì chúng đại diện cho một tính năng rất gọn gàng trong Python. Dưới đây là một số điều cần nhớ:

  • Sử dụng và thiết kế decorator đúng cách có thể làm cho code của bạn trở nên tốt hơn, sạch sẽ hơn và đẹp hơn.
  • Sử dụng decorator có thể giúp bạn DRY code—di chuyển các code giống nhau từ bên trong các hàm vào decorator.
  • Khi bạn sử dụng các decorator nhiều hơn, bạn sẽ thấy những cách tốt hơn, phức tạp hơn để sử dụng chúng.

Hãy nhớ kiểm tra những gì mà chúng tôi đang bán và các tài liệu nghiên cứu trên Envato Market, và đừng ngần ngại đặt câu hỏi và cung cấp các phản hồi có giá trị của bạn trong phần bình luận bên dưới.

Như vậy, chúng ta đã tìm hiểu xong về decorator. Chúc bạn sử dụng tốt decorator!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.