介绍
Python 中的装饰器(Decorators)允许你修改或增强函数、类或方法的行为。它们是一种在不改变源代码的情况下动态改变代码功能的方式。在本实验中,我们将探索装饰器的基础知识,并学习如何使用它们为你的代码添加功能。
Python 中的装饰器(Decorators)允许你修改或增强函数、类或方法的行为。它们是一种在不改变源代码的情况下动态改变代码功能的方式。在本实验中,我们将探索装饰器的基础知识,并学习如何使用它们为你的代码添加功能。
让我们从一个简单的例子开始。打开一个新的 Python 解释器会话:
python3
我们有一个计算数字平方的函数:
def square(x):
return x**2
现在假设我们想为 square
函数添加一个功能,每次调用时记录函数的输入和输出。我们可以使用装饰器来实现这一点。
以下是 logger
装饰器的代码:
def logger(func):
def wrapper(x):
print("Calling function:", func.__name__)
print("Input:", x)
result = func(x)
print("Output:", result)
return result
return wrapper
现在我们可以使用这个装饰器来增强 square
函数:
@logger
def square(x):
return x**2
当我们调用 square(5)
时,输出将是:
Calling function: square
Input: 5
Output: 25
如你所见,装饰器在不改变 square
函数源代码的情况下为其添加了所需的功能。
装饰器也可以接受参数。例如,我们可以修改 logger
装饰器,使其在记录输入和输出之前打印一条自定义消息。
def logger(message):
def decorator(func):
def wrapper(x):
print(message)
print("Calling function:", func.__name__)
print("Input:", x)
result = func(x)
print("Output:", result)
return result
return wrapper
return decorator
现在我们可以使用这个更新后的装饰器来增强 square
函数:
@logger("This is a custom message")
def square(x):
return x**2
当我们调用 square(5)
时,输出将是:
This is a custom message
Calling function: square
Input: 5
Output: 25
你也可以将多个装饰器叠加在一起,以添加多层功能。例如,我们创建一个名为 timer
的新装饰器,用于测量函数运行所需的时间:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("Time elapsed:", end_time - start_time)
return result
return wrapper
现在让我们在 square
函数上同时使用 logger
和 timer
装饰器:
@logger("This is a custom message")
@timer
def square(x):
return x**2
当我们调用 square(5)
时,输出将是:
This is a custom message
Calling function: square
Input: 5
Output: 25
Time elapsed: 0.000001
如你所见,timer
装饰器为 square
函数添加了运行时间信息,而 logger
装饰器则添加了输入输出日志和自定义消息。
在本实验中,我们学习了 Python 中装饰器的基础知识。我们了解了如何使用装饰器来修改函数、类或方法的行为,以及如何使用多个装饰器来添加多层功能。我们还学习了如何使用带参数的装饰器来添加自定义功能。
掌握了这些技能后,你现在可以开始将装饰器应用到代码中,从而让开发工作变得更加轻松!