Trình trang trí trong Python Programiz

Lần đầu tiên tôi bắt gặp decorators trong Python là khi tôi đang triển khai mô hình của mình bằng Flask. Tôi đã xem qua tài liệu Flask và bắt gặp một chức năng trang trí, có nội dung như @app. tuyến đường["/"]. Tôi đã bị hấp dẫn và bắt đầu đọc thêm về nó và nhận ra rằng khái niệm về người trang trí rất thú vị và hữu ích

Nếu bạn cũng bắt gặp một cái gì đó như @some_function được viết trên một số chức năng khác và bạn tò mò muốn biết về nó thì bạn nên xem qua bài viết này. Khái niệm về người trang trí được coi là hơi khó hiểu và bài viết này cố gắng đơn giản hóa sự hiểu biết về người trang trí

Chúng ta hãy nhanh chóng đi qua các nền tảng và các khối xây dựng để hiểu các khái niệm

Mục lục

  1. Hàm là một đối tượng hạng nhất trong Python
  2. Một tính năng quan trọng của hàm lồng nhau
  3. xây dựng trang trí
  4. Trang trí tổng quát
  5. Phần kết luận
  6. Người giới thiệu

Để nắm vững khái niệm về decorator, trước tiên chúng ta nên biết và sử dụng thoải mái các hàm như một đối tượng

Hàm là một đối tượng hạng nhất trong Python

Trong Python, mọi thứ đều là một đối tượng và gọi một số đối tượng là đối tượng hạng nhất chỉ là một tính từ ưa thích được sử dụng cho một đối tượng có các đặc quyền sau

  • Các chức năng có thể được lưu trữ trong các cấu trúc dữ liệu như danh sách, bộ dữ liệu và từ điển
  • Các biến có thể được gán cho một chức năng
  • Các chức năng có thể được truyền dưới dạng đối số cho các chức năng khác
  • Một chức năng có thể được trả về từ một chức năng

Nói tóm lại, một đối tượng hạng nhất giống như một quả bóng đá, có thể chuyền và ném ở bất kỳ đâu trong chương trình. Chúng ta hãy lấy tất cả các đặc điểm được đề cập ở trên của một đối tượng hạng nhất và xem xét từng cái một

Các chức năng có thể được lưu trữ trong các cấu trúc dữ liệu như danh sách, bộ dữ liệu và từ điển

Hãy tạo một số chức năng đơn giản và lưu trữ chúng dưới dạng một bộ sưu tập trong danh sách

Đầu tiên, chúng tôi đã xác định hai chức năng 'thêm' và 'nhân'

Thứ hai, thêm hai chức năng này vào một danh sách và sau đó gọi các chức năng bằng cách truy cập các chức năng thông qua danh sách

Do đó, từ điều này, chúng ta có thể dễ dàng thấy rằng các chức năng có thể được lưu trữ trong cấu trúc dữ liệu kiểu tập hợp

Các biến có thể được gán cho một chức năng

Chúng ta có thể gán một biến cho một hàm, sau đó gọi hàm đó bằng tên biến đã gán. Mã được đưa ra dưới đây cho thấy cùng

Trong mã, chúng tôi đã gán một biến 'var_add' cho hàm 'add'. Cuối cùng, biến được gán đã được sử dụng để gọi hàm thành công

***

Các chức năng có thể được truyền dưới dạng đối số cho các chức năng khác

Trong Python, một hàm là một đối tượng nên nó cũng có thể được truyền dưới dạng đối số cho các hàm khác

***

Một điều quan trọng cần lưu ý ở đây là khi chúng ta chuyển hàm như một đối tượng, chúng ta không bao giờ sử dụng các hàm có dấu ngoặc. Lý do rất đơn giản, các hàm cùng với dấu ngoặc được sử dụng để thực hiện lời gọi hàm

Mã được đề cập dưới đây cho thấy sự khác biệt. Như chúng ta đã biết hàm type[] trả về kiểu của đối tượng/lớp, do đó chúng ta đã áp dụng hàm kiểu trên tên hàm có và không có dấu ngoặc để biết sự khác biệt giữa hai loại

***

Một chức năng có thể được trả về từ một chức năng

Như đã đề cập ở trên, chúng ta biết rằng một hàm là một đối tượng do đó một hàm có thể trả về một đối tượng hàm. Đoạn mã dưới đây hiển thị giống nhau

*** Một tính năng quan trọng của hàm lồng nhau

Có một tính năng rất quan trọng của các chức năng lồng nhau mà chúng ta cần biết để hiểu Decorators, chúng ta sẽ thảo luận ngắn gọn về tính năng đó tại đây

Trong đoạn mã dưới đây, chúng ta đã định nghĩa một hàm bên ngoài với một hàm bên trong được lồng bên trong hàm bên ngoài. Điều thú vị cần lưu ý ở đây là hàm lồng bên trong có thể truy cập các tham số/đối số của hàm bên ngoài

Ghi chú. Các tham số đề cập đến các biến khi chúng ta định nghĩa một hàm trong khi các đối số là các giá trị được gán cho các tham số đó trong khi gọi một hàm

Một hàm lồng nhau có thể truy cập các tham số/biến của phạm vi kèm theo. Tính năng này của một hàm lồng nhau được gọi là Đóng. Tính năng này được sử dụng rộng rãi trong trang trí

*** Trang trí tòa nhà

Vì vậy, bây giờ, chúng ta đã biết một số tính năng quan trọng nhất của đối tượng chức năng. Như vậy, chúng ta có nền tảng hoàn hảo để xây dựng khái niệm về người trang trí

Đầu tiên chúng ta hãy đi qua định nghĩa của chức năng trang trí

Trình trang trí trong Python là một hàm chấp nhận một hàm khác làm tham số và nó thường sửa đổi hoặc nâng cao hàm mà nó đã chấp nhận và trả về hàm đã sửa đổi

Để hiểu định nghĩa về trình trang trí này, hãy xem qua mã được cung cấp bên dưới, từng bước một

Đầu tiên, chúng ta đã định nghĩa một hàm trang trí với tên hàm là 'decorator'. Hàm này chấp nhận một hàm khác 'func' làm tham số

Thứ hai, hàm trang trí là một hàm bên ngoài và nó cũng có một hàm bên trong có tên là 'trình bao bọc' được định nghĩa bên trong hàm trang trí. Hàm bao bọc này gọi hàm func[a,b] và trả về bình phương của giá trị được trả về bởi hàm func[a,b]

Thứ ba, Hàm trang trí này chấp nhận 'func' làm tham số và trả về hàm bao bọc

Thứ tư, chúng ta cũng đã định nghĩa riêng một hàm add. Mục đích của việc xác định chức năng này là chuyển chức năng này cho chức năng trang trí và kiểm tra xem nó đã được sửa đổi như thế nào

***

Chúng ta có thể thấy rằng hành vi chức năng của chức năng 'thêm' đã được sửa đổi hoàn toàn sau khi áp dụng chức năng trang trí trên nó

Nếu chúng ta tìm hiểu sâu hơn và kiểm tra tên của hàm bên dưới thì chúng ta sẽ thấy rằng đó là hàm bao bọc, đang chạy bên dưới tên 'add'. Do đó, 'thêm' chỉ là một tên biến được gán cho hàm bao bọc

Đó là lý do tại sao chức năng ban đầu 'thêm' không cộng số mà bình phương tổng các số sau khi áp dụng trình trang trí

Sử dụng @ trong trang trí

Để làm cho các trình trang trí dễ đọc hơn, chúng tôi sử dụng @ cùng với tên chức năng của trình trang trí

# Without using @
add = decorator[add]

hoặc là

# with @
@decorator
def add[x,y]:
return x+y

Cả hai cách [có hoặc không có '@'], chúng ta có thể gán chức năng trang trí. Tuy nhiên, sử dụng '@' thường được chấp nhận và cách rõ ràng để gán các trình trang trí cho các hàm python

Trang trí tổng quát

Trình trang trí thường được xác định trước chức năng mà nó sửa đổi. Tuy nhiên, trong trình trang trí được xác định ở trên, hàm bao bọc sử dụng cùng một số tham số như trong hàm mà trình trang trí đang được áp dụng. Đó chỉ là một ví dụ đơn giản để cho thấy cách trang trí hoạt động

Ngược lại với decorator đã định nghĩa ở trên, nếu chúng ta muốn tạo một decorator có thể áp dụng cho bất kỳ chức năng nào thì chúng ta cần linh hoạt trong việc gán số lượng tham số. Tính linh hoạt đó đạt được bởi *args và **kwargs. *args và **kwargs cho phép chúng ta truyền nhiều đối số hoặc đối số dựa trên từ khóa cho một hàm

Từ đoạn mã dưới đây, chúng ta có thể thấy rằng chúng ta đã truyền nhiều đối số trong khi gọi hàm xyz

Nhiều đối số được lưu trữ trong biến args và * được sử dụng để giải nén các đối số này và do đó chúng ta có thể đạt được sự linh hoạt về số lượng đối số trong một hàm

Chúng ta có thể gọi cùng một hàm xyz với 2 đối số và nó hoạt động tốt

Tương tự, chúng ta có thể hiểu chức năng của **kwargs như được đề cập trong đoạn mã dưới đây. Ở đây một lần nữa ** hoạt động như một toán tử giải nén và kwargs hoạt động như một từ điển các cặp giá trị chính

***

Bây giờ sau khi biết *args và **kwargs, chúng ta có thể tạo một trình trang trí tổng quát không phụ thuộc vào số lượng đối số

Đoạn mã được đề cập dưới đây cho thấy cách chúng ta có thể sử dụng *args ,**kwargs theo các yêu cầu trong hàm bao bọc bởi vì cuối cùng, hàm bao bọc sẽ thay thế hàm ban đầu [add_num[x,y]] bằng cách sử dụng các đối số của

Sau khi áp dụng hàm trang trí trên hàm ban đầu add_num, nó đã được sửa đổi và thay vì thêm các đối số, nó bắt đầu trả về tổng bình phương của các đối số

Chúng ta có thể áp dụng trình trang trí này cho hàm với bất kỳ số lượng đối số nào [tham khảo mã bên dưới]. Vì vậy, chúng tôi có thể tạo một trình trang trí một lần và sử dụng nó ở bất cứ đâu được yêu cầu

Phần kết luận

Mục đích của bài viết này là cung cấp cho bạn đủ thông tin để người đọc dễ hiểu, làm việc và xây dựng dựa trên những điều cơ bản của người trang trí

Các trình trang trí trong Python là gì?

Trình trang trí là mẫu thiết kế trong Python cho phép người dùng thêm chức năng mới vào đối tượng hiện có mà không sửa đổi cấu trúc của đối tượng . Trình trang trí thường được gọi trước khi định nghĩa chức năng bạn muốn trang trí.

Tại sao nên sử dụng trình trang trí trong Python?

Khi nào nên sử dụng Trình trang trí trong Python. Bạn sẽ sử dụng một trình trang trí khi bạn cần thay đổi hành vi của một hàm mà không sửa đổi chính hàm đó . Một vài ví dụ điển hình là khi bạn muốn thêm ghi nhật ký, kiểm tra hiệu suất, thực hiện lưu vào bộ nhớ đệm, xác minh quyền, v.v.

Trình trang trí trong Python w3schools là gì?

Trình trang trí trong siêu lập trình Python là một dạng cụ thể của hàm nhận các hàm làm đầu vào và trả về một hàm mới làm đầu ra . Có một số trình trang trí tích hợp viz. @classmethod. @staticmethod.

Trình trang trí hoạt động như thế nào trong Python?

Trình trang trí trong Python là hàm nhận một hàm khác làm đối số và trả về một hàm khác . Trình trang trí có thể cực kỳ hữu ích vì chúng cho phép mở rộng chức năng hiện có mà không có bất kỳ sửa đổi nào đối với mã nguồn của chức năng ban đầu.

Chủ Đề