Khái niệm về hàm Decorator trong Python
Decorator là công cụ rất mạnh mẽ và hữu ích trong Python vì nó cho phép các lập trình viên sửa đổi hành vi của hàm hoặc lớp. Decorator cho phép chúng ta nhận tham số đầu vào là một hàm khác và mở rộng tính năng cho hàm đó mà không thay đổi nội dung của nó.
Ví dụ về hàm Decorator trong Python
>>> Xem thêm: Hàm eval trong Python - Ví dụ và công dụng của hàm eval trong Python
Cú pháp của hàm Decorator trong Python
@gfg_decorator
def hello_decorator():
print("Gfg")
'''Above code is equivalent to -
def hello_decorator():
print("Gfg")
hello_decorator = gfg_decorator(hello_decorator)'''
Trong ví dụ này, gfg_decorator là một hàm có thể gọi, hàm này có thể thêm một số mã vào đầu một số hàm callable khác như hàm hello_decorator và trả về hàm wrapper.
>>> Tham khảo: Khóa học lập trình Python
Kỹ thuật ghi nhớ (Memoization) bằng cách sử dụng Decorator trong Python
Khái niệm Memoization
Ghi nhớ là một kỹ thuật ghi lại các kết quả trung gian để chúng có thể được sử dụng nhằm tránh tính toán lặp lại và tăng tốc độ cho chương trình. Ghi nhớ có thể được sử dụng để tối ưu hóa các chương trình sử dụng đệ quy. Trong Python, ghi nhớ có thể được thực hiện với sự trợ giúp của Decorator.
Ví dụ về Memoization
Ví dụ về cách tính giai thừa của một số:
# Simple recursive program to find factorial
def facto(num):
if num == 1:
return 1
else:
return num * facto(num-1)
print(facto(5))
Chương trình như trên có thể sử dụng Decorator để giải quyết như sau:
# Factorial program with memoization using
# decorators.
# A decorator function for function 'f' passed
# as parameter
def memoize_factorial(f):
memory = {}
# This inner function has access to memory
# and 'f'
def inner(num):
if num not in memory:
memory[num] = f(num)
return memory[num]
return inner
@memoize_factorial
def facto(num):
if num == 1:
return 1
else:
return num * facto(num-1)
print(facto(5))
Giải thích về hàm Memoization
Có thể giải thích ví dụ trên như sau:
- Một hàm có tên memoize_factoria l đã được định nghĩa. Mục đích chính của nó là lưu trữ các kết quả trung gian trong biến được gọi là bộ nhớ.
- Chức năng thứ hai được gọi là facto là chức năng để tính toán giai thừa. Nó đã được chú thích bởi một decorator (hàm memoize_factorial). Facto có quyền truy cập vào biến bộ nhớ.
- Khi facto (5) được gọi, các phép toán đệ quy diễn ra ngoài việc lưu trữ các kết quả trung gian. Mỗi khi một phép tính cần được thực hiện, nó sẽ được kiểm tra xem kết quả có sẵn trong bộ nhớ hay không . Nếu có, thì nó được sử dụng, ngược lại, giá trị được tính toán và được lưu trữ trong bộ nhớ .
Gỡ lỗi bằng Decorator trong Python
Bạn có thể sử dụng trình Decorator trong Python để gỡ lỗi bằng cách dùng functools.wraps() trong thư viện tiêu chuẩn của Python.
Ví dụ như sau:
# importing the module
import functools
# decorator
def make_geek_happy(func):
@functools.wraps(func)
def wrapper():
neutral_message = func()
happy_message = neutral_message + " You are happy!"
return happy_message
return wrapper
def speak():
"""Returns a neutral message"""
return "Hi!"
positive_message = make_geek_happy(speak)
print(positive_message())
print(speak.__name__)
print(speak.__doc__)
print(positive_message.__name__)
print(positive_message.__doc__)
Output nhận được như sau:
Hi! You are happy!
speak
Returns a neutral message
speak
Returns a neutral message
Kết luận:
Có thể thấy Decorator trong Python là một công cụ tuyệt vời để gói các mã quanh các hàm và lớp. Bài viết trên đã giới thiệu về Decorator và một số chức năng của hàm này. Hy vọng bạn có thể ứng dụng các kiến thức này trong lập trình với Python. Tìm hiểu thêm về Python và các ngôn ngữ lập trình khác qua các khóa học lập trình tại T3H.