Python中的装饰器函数是什么
装饰器函数是Python中一种特殊的函数,可以用于在不修改原函数代码的情况下,对原函数进行扩展或修改。装饰器函数可以接受一个函数作为参数,并返回一个新的函数。被装饰的函数在被调用时,会先经过装饰器函数的处理,再执行原函数的逻辑。装饰器函数可以实现一些公共的功能,例如日志记录、性能分析、身份验证等。
装饰器函数的基本语法如下:
def decorator_func(original_func):
def wrapper_func(*args, **kwargs):
# 对原函数进行扩展或修改的代码
return original_func(*args, **kwargs) # 调用原函数
return wrapper_func
装饰器函数接受一个原函数作为参数,内部定义一个包装函数(wrapper_func),并返回该包装函数。包装函数接受任意数量的位置参数和关键字参数,并在内部对原函数进行扩展或修改的操作,最后调用原函数并返回其结果。
使用装饰器函数可以实现很多功能,下面介绍几种常见的装饰器用法。
1. 日志记录
日志记录是一种常见的需求,可以通过装饰器函数来实现。下面是一个简单的示例:
import logging
def log_decorator(func):
def wrapper(*args, **kwargs):
logging.info(f"Calling function {func.__name__} with args {args} and kwargs {kwargs}")
return func(*args, **kwargs)
return wrapper
@log_decorator
def add(a, b):
return a + b
print(add(1, 2)) # 输出: 3
在这个示例中,log_decorator函数是一个装饰器函数,它会在函数被调用时记录日志信息。将装饰器应用于add函数后,每次调用add函数时,都会先执行log_decorator函数内部的逻辑,然后再执行add函数的逻辑。
2. 性能分析
性能分析是另一个常见的需求,可以通过装饰器函数来实现。下面是一个简单的示例:
import time
def performance_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function {func.__name__} took {end_time - start_time} seconds")
return result
return wrapper
@performance_decorator
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 输出: 55
在这个示例中,performance_decorator函数是一个装饰器函数,它会在函数被调用时记录函数执行的时间。将装饰器应用于fibonacci函数后,每次调用fibonacci函数时,都会先执行performance_decorator函数内部的逻辑,然后再执行fibonacci函数的逻辑。
3. 身份验证
身份验证是一种常见的安全需求,可以通过装饰器函数来实现。下面是一个简单的示例:
def authenticate_decorator(func):
def wrapper(*args, **kwargs):
if not is_authenticated():
raise Exception("Access denied")
return func(*args, **kwargs)
return wrapper
@authenticate_decorator
def get_user_info(user_id):
return fetch_user_info(user_id)
print(get_user_info(123)) # 输出: 用户信息
在这个示例中,authenticate_decorator函数是一个装饰器函数,它会在函数被调用时进行身份验证。将装饰器应用于get_user_info函数后,每次调用get_user_info函数时,都会先执行authenticate_decorator函数内部的逻辑,然后再执行get_user_info函数的逻辑。如果身份验证失败,则会抛出异常。
除了上述示例,装饰器函数还可以用于缓存、重试、限流等功能的实现。装饰器函数的应用非常灵活,可以根据具体的需求进行扩展和修改,是Python中非常有用的特性。
