Python函数与装饰器的结合应用
Python中的装饰器是一种特殊的函数,用于对其他函数进行扩展和修改。装饰器函数接受一个函数作为参数,并返回一个新的函数。装饰器函数常用于为函数添加功能,如日志记录、性能测试、权限控制等。
在Python中,定义一个装饰器函数的方法如下:
def decorator_function(func):
def wrapper(*args, **kwargs):
# 在函数前添加功能
print("调用装饰器前")
# 调用原函数
result = func(*args, **kwargs)
# 在函数后添加功能
print("调用装饰器后")
return result
return wrapper
下面是一个使用装饰器函数的例子:
@decorator_function
def say_hello():
print("Hello World!")
当调用say_hello()函数时,实际上是调用了装饰器函数decorator_function返回的wrapper函数。在wrapper函数中,我们可以在调用原函数前后添加额外的功能,例如打印日志。
函数和装饰器的结合应用有很多,下面介绍几个常见的用法。
1. 记录日志
装饰器可以用于记录函数的调用日志,例如可以打印函数的参数和返回值。以下是一个记录日志的装饰器示例:
import datetime
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"调用时间:{datetime.datetime.now()}")
print(f"调用函数:{func.__name__}")
print(f"参数:{args}, {kwargs}")
result = func(*args, **kwargs)
print(f"返回结果:{result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add(1, 2)
运行上述代码,输出如下:
调用时间:2022-01-01 10:00:00
调用函数:add
参数:(1, 2), {}
返回结果:3
2. 计算函数执行时间
装饰器可以用于计算函数的执行时间,以评估函数的性能。以下是一个计算函数执行时间的装饰器示例:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f"函数'{func.__name__}'执行时间:{execution_time:.4f}秒")
return result
return wrapper
@timer_decorator
def calculate_sum(n):
result = 0
for i in range(n+1):
result += i
return result
calculate_sum(1000000)
运行上述代码,输出如下:
函数'calculate_sum'执行时间:0.0500秒
3. 权限控制
装饰器可以用于实现权限控制,例如只允许某些用户执行特定的函数。以下是一个简单的权限控制装饰器示例:
def permission_required(permission):
def decorator(func):
def wrapper(user, *args, **kwargs):
if user_has_permission(user, permission):
return func(user, *args, **kwargs)
else:
raise PermissionError("You do not have permission to access this resource.")
return wrapper
return decorator
@permission_required("ADMIN")
def delete_user(user_id):
# 删除用户的逻辑
pass
delete_user("admin", 123)
在上述示例中,permission_required是一个装饰器工厂函数,返回一个装饰器函数decorator。decorator函数内部定义了一个新的函数wrapper,用于进行权限验证。如果用户拥有指定的权限,就执行原函数func;否则,抛出PermissionError异常。这样,我们可以通过为函数添加@permission_required("ADMIN")装饰器,限制只有拥有ADMIN权限的用户才能执行delete_user函数。
综上所述,装饰器是一种非常有用的特性,在Python中被广泛地应用于函数的扩展和修改。通过结合函数和装饰器,可以实现很多功能,如日志记录、性能测试、权限控制等,使代码更加健壮和灵活。
