欢迎访问宙启技术站
智能推送

Python函数与装饰器的结合应用

发布时间:2023-07-01 05:52:46

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是一个装饰器工厂函数,返回一个装饰器函数decoratordecorator函数内部定义了一个新的函数wrapper,用于进行权限验证。如果用户拥有指定的权限,就执行原函数func;否则,抛出PermissionError异常。这样,我们可以通过为函数添加@permission_required("ADMIN")装饰器,限制只有拥有ADMIN权限的用户才能执行delete_user函数。

综上所述,装饰器是一种非常有用的特性,在Python中被广泛地应用于函数的扩展和修改。通过结合函数和装饰器,可以实现很多功能,如日志记录、性能测试、权限控制等,使代码更加健壮和灵活。