Python函数的装饰器与应用示例
装饰器是Python中一种特殊的语法结构,用于修改或者扩展函数或者类的功能。它允许在不修改被装饰对象源代码的前提下为其新增一些额外的功能。
装饰器的作用是通过定义一个包装函数来修改被装饰函数的行为,并将包装函数作为装饰器函数的返回值。装饰器可以用于很多场景,比如日志记录、性能分析、权限校验等。
下面我们通过一些具体的例子来说明Python函数装饰器的应用。
1. 计时器装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 的执行时间为 {end_time - start_time} 秒")
return result
return wrapper
@timer
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
上述例子中,我们定义了一个timer装饰器函数,它接受一个函数作为参数,并返回一个新的包装函数wrapper。wrapper函数记录了被装饰函数的执行时间,并在函数执行完毕后输出执行时间。通过在fibonacci函数上使用@timer装饰器,我们可以很方便地为fibonacci函数增加计时功能。
2. 权限验证装饰器
def check_permission(permission):
def decorator(func):
def wrapper(*args, **kwargs):
if has_permission(permission):
return func(*args, **kwargs)
else:
raise PermissionError("Permission denied")
return wrapper
return decorator
@check_permission("admin")
def add_user(user):
# 添加用户的逻辑
pass
add_user("Alice")
上述例子中,我们定义了一个check_permission装饰器函数,它接受一个权限字符串作为参数,并返回一个新的装饰器函数decorator。decorator函数接受一个被装饰的函数作为参数,并返回一个新的包装函数wrapper。wrapper函数在执行被装饰的函数之前首先检查权限,如果有权限则执行被装饰的函数,否则抛出PermissionError异常。通过在add_user函数上使用@check_permission("admin")装饰器,我们可以很方便地为add_user函数增加权限验证功能。
3. 缓存装饰器
def cache(func):
cache_dict = {}
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key in cache_dict:
return cache_dict[key]
result = func(*args, **kwargs)
cache_dict[key] = result
return result
return wrapper
@cache
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
上述例子中,我们定义了一个cache装饰器函数,它接受一个函数作为参数,并返回一个新的包装函数wrapper。wrapper函数首先检查缓存字典cache_dict中是否有参数对应的结果,如果有则直接返回结果,否则调用被装饰的函数计算结果,并将结果存入缓存字典。通过在fibonacci函数上使用@cache装饰器,我们可以很方便地为fibonacci函数增加缓存功能,避免重复计算。
这些例子仅仅是装饰器的一部分应用示例,实际上装饰器还可以应用到很多其他场景,比如输入校验、输出美化等。装饰器的灵活性和强大的功能使得它成为Python中非常重要的一部分。掌握装饰器的使用可以提高代码的可读性和可维护性,同时也有助于提高开发效率。
