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

Python中的装饰器:在函数的运行时修改其行为

发布时间:2023-11-06 17:02:50

装饰器是Python中一种特殊的函数,可以在不修改原函数代码的情况下,动态地为函数添加功能或修改函数的行为。装饰器可以提供一种简洁、优雅的方式来实现代码的复用和扩展。

在Python中,装饰器是通过在函数的定义之前使用@符号来使用的。一个装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。这个新的函数通常包装了原函数,通过在原函数的前后添加一些额外的代码来修改其行为。

装饰器实现函数的运行时修改行为有多种方式,下面是几个常见的例子:

1. 记录日志

一个常见的用例是记录函数的调用日志。可以定义一个装饰器,每次函数被调用时将调用信息打印出来。例如:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__} with args {args} and kwargs {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def my_function(x, y):
    return x + y

result = my_function(3, 4)  # 输出: Calling function my_function with args (3, 4) and kwargs {}
print(result)  # 输出: 7

2. 计时器

另一个常见的用例是在函数执行前后记录时间,从而计算函数的执行时间。可以定义一个装饰器来实现这个功能。例如:

import time

def timer_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 to run")
        return result
    return wrapper

@timer_decorator
def my_function(x, y):
    time.sleep(1)  # 模拟耗时操作
    return x + y

result = my_function(3, 4)  # 输出: Function my_function took 1.0000584125518799 seconds to run
print(result)  # 输出: 7

3. 缓存结果

有时候一个函数的执行结果会被频繁使用,可以使用装饰器来缓存函数的结果,以避免重复计算。例如:

def cache_decorator(func):
    cache = {}

    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result

    return wrapper

@cache_decorator
def my_function(x, y):
    print("Calculating...")
    return x + y

result = my_function(3, 4)  # 输出: Calculating...
print(result)  # 输出: 7

result = my_function(3, 4)  # 输出: 7 (从缓存读取结果,不再计算)

以上只是一些常见的装饰器用例,实际上装饰器的应用是非常灵活的,可以根据需求自由组合和编写不同的装饰器。装饰器提供了一种强大且优雅的方式来修改函数的行为,使代码更加模块化、可复用和易于维护。