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

如何在 Python 中定义并调用装饰器函数

发布时间:2023-05-29 02:20:11

装饰器函数是 Python 中一种常见的高阶函数,其作用是对其他函数进行增强或修改。在 Python 中,装饰器函数可以使用 @ 语法糖来定义和调用,也可以使用普通的函数调用语法来定义和调用。

下面是一个用于计算函数运行时间的装饰器函数示例:

import time

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

@time_it
def my_func():
    time.sleep(1)

my_func()

在上面的示例中,我们定义了一个 time_it 装饰器函数,它接受一个函数作为参数,并返回一个内部函数 wrapper。在 wrapper 函数中,我们使用了 time 模块来计算函数运行时间,并输出了函数名称和运行时间。最后,我们返回了函数的结果。

使用 @ 语法糖来装饰 my_func 函数,相当于执行了以下代码:

my_func = time_it(my_func)

这样,当我们调用 my_func 函数时,实际上是先调用 wrapper 函数,然后再执行 my_func 函数。在 wrapper 函数中计算运行时间,并输出结果。

除了使用 @ 语法糖来定义装饰器函数外,我们还可以使用普通的函数调用语法来定义和使用装饰器函数。以下是示例代码:

import time

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

def my_func():
    time.sleep(1)

my_func = time_it(my_func)

在这个示例中,我们首先定义了一个 time_it 装饰器函数,然后定义了一个普通的 my_func 函数。在将函数作为参数传递给 time_it 函数时,我们使用了普通的函数调用语法。

最后,我们将装饰过的 my_func 函数重新赋值给 my_func 变量。这样,当我们调用 my_func 函数时,实际上也是调用了 wrapper 函数,然后再执行 my_func 函数。

总结来说,在 Python 中定义和调用装饰器函数,可以使用 @ 语法糖来定义,并在需要增强或修改函数行为时使用。也可以使用普通的函数调用语法来定义和使用装饰器函数。无论使用哪种方式,装饰器函数都是 Python 中非常强大和灵活的工具。