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

装饰器函数:如何使用Python实现装饰器功能

发布时间:2023-06-10 17:03:19

装饰器是Python语言中一种非常重要的函数功能,它可以扩展并改变一个函数的行为,从而实现一些特定的需求。装饰器函数是一个自定义的函数,它可以接受任何函数,并添加一些额外的特性,比如缓存、日志记录、输入验证等。

装饰器的功能是将一个函数作为参数,然后返回一个新的函数,这个新的函数替代了原有的函数,具有了额外的功能。

实现的方法是在代码中使用 @ 符号和装饰器函数名称,把需要装饰的函数作为参数传递给装饰器函数。下面是一个例子:

def my_decorator(func):
    def wrapper():
        print("Before the function is called.")
        func()
        print("After the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello World!")

say_hello()

上面的代码中,我们定义了一个装饰器函数 my_decorator,它接受一个函数 func 作为参数。my_decorator 函数返回一个新的函数 wrapper,这个函数在调用 func 之前和之后会输出一些信息,在调用 func 之前输出 Before the function is called.,在调用 func 之后输出 After the function is called.

我们在 say_hello 函数上使用了装饰器函数 my_decorator,以 @my_decorator 的形式进行注释,这样 say_hello 函数就被 my_decorator 指定的 wrapper 函数所替代了。

最后调用 say_hello 函数,输出如下:

Before the function is called.
Hello World!
After the function is called.

以上就是装饰器函数的一个基本实现示例。接下来,我们来分析这个装饰器函数的几个关键点:

1. 装饰器函数的参数是一个函数,它的返回值也必须是一个函数。在上面的例子中,装饰器函数参数为 func,返回一个函数 wrapper

2. 装饰器函数内部定义一个新的闭包函数 wrapper,这个闭包函数包含了对原始函数 func 的调用,并添加了在调用前后输出信息的功能。

3. 装饰器函数返回内部定义的 wrapper 函数,实际上是把原始函数替换成了装饰之后的函数。

下面我们来看一个更具实用性的装饰器函数,它是用来计算函数的执行时间的:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()
        res = func(*args, **kwargs)
        t2 = time.time()
        print(f'{func.__name__} ran in {t2-t1:.2f} seconds.')
        return res
    return wrapper

@timer
def my_func(n):
    time.sleep(n)
    return n

print(my_func(3))

上面的代码中,我们定义了一个装饰器函数 timer,它接受一个函数 func 作为参数,返回一个新的函数 wrapper。这个 wrapper 函数会计算 func 函数的执行时间,并在执行完毕之后输出时间信息。

我们在 my_func 函数上使用了 timer 装饰器,这样在调用 my_func 函数时会自动计算函数的执行时间。

最后我们调用 my_func 函数,传入参数 3,输出如下:

my_func ran in 3.00 seconds.
3

上面的装饰器函数实现了一个非常实用的功能,它可以测量函数的执行时间并输出结果。这个装饰器函数还有一个特点是使用了可变参数,它可以接受任意数量和类型的参数,并传递给被装饰的函数。

总结:通过以上两个实例我们可以了解装饰器的基本原理以及如何在 Python 中使用装饰器函数。装饰器函数可以为我们的代码增加更多的特性和功能,让我们的代码更加简洁、高效和灵活。