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

Python函数中的装饰器使用方法及示例

发布时间:2023-11-22 21:44:16

装饰器是 Python 中一种用于修改函数行为的特殊语法。它允许我们在不修改函数源代码的情况下,通过添加一个装饰器函数来改变函数的功能。这在很多场景下非常有用,比如日志记录、性能分析、输入验证等。

装饰器的使用方法很简单,首先定义一个装饰器函数,然后使用 @ 符号将其放在要修饰的函数定义之前。下面是一个简单的示例,演示如何使用装饰器实现函数调用前后打印日志:

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

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

result = add(3, 5)
print(result)

在上面的代码中,我们定义了一个装饰器函数 logger,它接受一个函数作为参数,并返回一个新的函数 wrapperwrapper 函数将在函数调用前后打印日志,并调用原始函数。最后,将装饰器应用到 add 函数,实现了打印日志的功能。

运行上面的代码,可以看到以下输出:

Calling function add with args: (3, 5), kwargs: {}
add returned: 8
8

在输出中,我们可以看到调用函数 add(3, 5) 之前和之后的日志,以及函数的返回值。

除了单个装饰器外,我们还可以使用多个装饰器来修饰函数。多个装饰器会依次对函数进行修饰,从最后一个装饰器开始,逐级向上,直到 个装饰器。下面是一个演示多个装饰器使用的示例:

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

def timer(func):
    import time

    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds to run")
        return result
    return wrapper

@timer
@logger
def multiply(a, b):
    return a * b

result = multiply(3, 5)
print(result)

这个例子中定义了一个新的装饰器函数 timer,它用于计算函数的执行时间。我们通过在 multiply 函数定义前使用 @logger@timer 装饰器,对 multiply 函数进行修饰。运行示例代码,会得到以下输出:

Calling function wrapper with args: (3, 5), kwargs: {}
multiply took 4.76837158203125e-07 seconds to run
wrapper returned: 15
15

可以看到,调用 multiply(3, 5) 之前和之后的日志,以及函数的返回值,以及函数的执行时间。

通过使用装饰器,我们可以轻松地修改函数的功能,而无需修改原始函数的代码。装饰器提供了一种优雅且灵活的方式来扩展和修改函数的行为,使我们的代码更加可维护和易读。