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

装饰器函数-如何使用装饰器来扩展函数功能?

发布时间:2023-07-04 14:51:56

装饰器函数是Python中一种特殊的函数,可以用来扩展其他函数的功能。装饰器函数可以在不改变被装饰函数源代码的情况下,为其添加额外的功能或修改其行为。

使用装饰器函数可以实现一些常见的功能,比如:记录日志、性能测试、缓存等。下面我们将以一个记录函数执行时间的装饰器函数为例,来介绍如何使用装饰器来扩展函数功能。

首先,我们定义一个装饰器函数,用来记录函数执行时间。

import time

def record_time(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

在上述代码中,我们定义了一个装饰器函数record_time,它接受一个函数作为参数func,并返回一个新的函数wrapperwrapper函数添加了记录执行时间的逻辑,然后调用原始函数func并返回结果。

接下来,我们使用装饰器函数来扩展我们的函数。假设我们有一个函数my_function,我们想要记录它的执行时间。

@record_time
def my_function(n):
    for i in range(n):
        print(i)
        time.sleep(1)

在上述代码中,我们使用@符号将装饰器函数应用到my_function函数上,相当于执行了my_function = record_time(my_function)。这样,每次调用my_function函数时,装饰器函数都会记录并打印该函数执行的时间。

最后,我们调用被装饰的函数来测试装饰器是否正常工作。

my_function(5)

执行以上代码,我们会看到以下输出结果:

0
Function my_function took 5.0010786056518555 seconds to execute.
1
Function my_function took 5.002331018447876 seconds to execute.
2
Function my_function took 5.0037431716918945 seconds to execute.
3
Function my_function took 5.000077962875366 seconds to execute.
4
Function my_function took 5.000677824020386 seconds to execute.

从输出结果可以看到,每次调用my_function函数时,装饰器函数都会记录并打印该函数执行的时间。

这就是使用装饰器函数来扩展函数功能的基本原理。通过定义一个装饰器函数,将其应用到其他函数上,我们可以在不改变函数源代码的情况下,为函数添加额外的功能或修改其行为。装饰器函数可以使我们的代码更易于维护、扩展和重用。