Python装饰器的简单应用指南
Python装饰器是一种函数,它可以接受一个函数作为参数,并返回一个新的函数。装饰器可以在不修改被装饰函数的情况下,增加功能或修改行为。在本文中,我将向你介绍如何使用装饰器,并提供一些具体的使用例子。
1. 装饰器的基本语法
装饰器的基本语法如下:
def decorator(func):
def wrapper(*args, **kwargs):
# 在调用被装饰函数之前执行的代码
result = func(*args, **kwargs)
# 在调用被装饰函数之后执行的代码
return result
return wrapper
在这个例子中,decorator是一个装饰器函数,它接受一个函数func作为参数,并返回一个新的函数wrapper。新的函数wrapper在调用func之前和之后可以执行一些额外的代码。*args和**kwargs是用来接收任意数量的位置参数和关键字参数。
2. 使用装饰器增加功能
装饰器可以用于增加函数的功能,例如打印函数执行时间、验证函数参数等。下面是一个使用装饰器打印函数执行时间的例子:
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"函数 {func.__name__} 执行时间: {end - start}秒")
return result
return wrapper
@timer
def my_function():
time.sleep(2)
my_function()
在这个例子中,timer是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。新的函数在调用被装饰函数之前记录开始时间,在调用之后记录结束时间,并打印执行时间。@timer语法将装饰器应用于函数my_function。
3. 使用装饰器修改行为
装饰器也可以用于修改函数的行为,例如修改函数的返回值、缓存计算结果等。下面是一个使用装饰器修改函数返回值的例子:
def doubler(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result * 2
return wrapper
@doubler
def my_function(x):
return x + 1
print(my_function(2)) # 输出: 6
在这个例子中,doubler是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。新的函数在调用被装饰函数之后将返回值乘以2。@doubler语法将装饰器应用于函数my_function。
4. 多个装饰器的应用顺序
当一个函数应用多个装饰器时,装饰器的应用顺序是从上到下的。例如:
def decorator1(func):
def wrapper(*args, **kwargs):
# 在调用被装饰函数之前执行的代码
result = func(*args, **kwargs)
# 在调用被装饰函数之后执行的代码
return result
return wrapper
def decorator2(func):
def wrapper(*args, **kwargs):
# 在调用被装饰函数之前执行的代码
result = func(*args, **kwargs)
# 在调用被装饰函数之后执行的代码
return result
return wrapper
@decorator1
@decorator2
def my_function():
pass
在这个例子中,my_function被装饰器decorator1和decorator2依次装饰。当调用my_function时,会按照以下顺序执行代码:decorator1的wrapper函数中的代码 -> decorator2的wrapper函数中的代码 -> my_function函数中的代码。
5. 带参数的装饰器
装饰器也可以接受参数,例如用来指定装饰器的行为或配置。下面是一个带参数的装饰器的例子:
def logger(level):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"[{level}] {func.__name__} 被调用了")
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@logger(level="INFO")
def my_function():
pass
my_function()
在这个例子中,logger是一个接受参数level的装饰器工厂函数,它返回一个装饰器函数decorator。新的函数wrapper在调用被装饰函数之前打印一个日志。@logger(level="INFO")语法将装饰器应用于函数my_function,并传递了参数level。
通过以上例子,你应该对Python装饰器有了一个基本的了解。装饰器可以在不修改函数代码的情况下,增加功能或修改函数的行为。使用装饰器可以提高代码的复用性和可维护性,使得代码更加简洁和灵活。
