在Python中,装饰器是一种强大的工具,它允许我们在不修改原始函数或方法的情况下,增加或修改其功能。装饰器本质上是一个接受函数作为参数并返回新函数的函数。这个概念可能听起来有些复杂,但通过一些实例,我们可以更好地理解它。
让我们从一个简单的例子开始。假设我们有一个函数,它打印出"Hello, World!"。我们可以创建一个装饰器,使得每次调用这个函数时,都会先打印出"Start:",然后再打印出"Hello, World!",最后打印出"End:"。
def my_decorator(func):
def wrapper():
print("Start:")
func()
print("End.")
return wrapper
@my_decorator
def hello():
print("Hello, World!")
hello()
在这个例子中,@my_decorator
就是一个装饰器。当我们调用hello()
函数时,实际上是在调用my_decorator(hello)
,这会返回一个新的函数wrapper
,然后调用这个新函数。
装饰器不仅可以添加新的功能,还可以修改现有的功能。例如,我们可以创建一个装饰器,它测量函数运行的时间:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} ran in: {end - start} seconds")
return result
return wrapper
@timer_decorator
def long_running_function():
time.sleep(2)
long_running_function()
在这个例子中,timer_decorator
装饰器接受一个函数作为参数,返回一个新的函数wrapper
。这个新函数首先记录当前时间,然后调用原始函数,再次记录当前时间,然后计算并打印出函数运行的时间。
装饰器还可以有更高级的应用,例如用于日志记录、缓存结果、限制函数的并发执行等。总的来说,装饰器是Python中一个非常强大的工具,它可以帮助我们编写更简洁、更可重用的代码。