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

认识Python中的装饰器及其实际应用案例

发布时间:2023-11-12 07:56:50

装饰器是Python中一种用于扩展函数或类功能的语法特性。它可以在不修改被装饰对象源代码的情况下,动态地给函数或类添加一些额外的功能。

装饰器的本质是一个函数,它接收一个函数作为参数,并返回一个新的函数。通过使用@符号可以将装饰器应用到函数或类上。当被装饰对象被调用时,装饰器会先执行一些特定的逻辑,然后再执行被装饰对象本身的逻辑。

装饰器的实际应用案例非常丰富,下面介绍几个常见的实例:

1. 记录日志

装饰器可以用于记录函数的调用日志,方便调试和排查问题。例如,可以通过装饰器在函数调用前后打印出函数的名称和参数,以及函数的执行结果。这样可以追踪函数的执行过程,快速地定位问题所在。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function '{func.__name__}' with args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"Function '{func.__name__}' returned: {result}")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

print(add(1, 2))
# Output:
# Calling function 'add' with args: (1, 2), kwargs: {}
# Function 'add' returned: 3
# 3

2. 认证和授权

装饰器可以用于对函数进行认证和授权,以确保只有满足特定条件的用户才能执行某些敏感操作。例如,可以定义一个装饰器来检查用户是否已登录,如果未登录则跳转到登录页面。

def login_required(func):
    def wrapper(*args, **kwargs):
        if not is_user_logged_in():
            redirect_to_login_page()
        return func(*args, **kwargs)
    return wrapper

@login_required
def delete_post(post_id):
    # Delete the post with given post_id
    pass

3. 计时器

装饰器可以用于计算函数的执行时间,方便性能优化和代码分析。例如,可以定义一个装饰器来记录函数的执行时间,并打印出来。

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"Function '{func.__name__}' took {execution_time} seconds to execute")
        return result
    return wrapper

@timer_decorator
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))
# Output:
# Function 'fibonacci' took 0.011 seconds to execute
# 55

以上只是装饰器的一些应用案例,实际上可以根据实际需求定义各种不同的装饰器来扩展函数或类的功能。通过使用装饰器,可以避免代码的重复和冗余,提高代码的可读性和可维护性。