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

如何使用Python中的装饰器(decorator)函数

发布时间:2023-06-13 07:49:57

在 Python 中,装饰器是一种可以将一个函数或者类加工为另外一个函数或者类的可调用对象。它常用于在代码执行期间动态地修改类或者函数的行为。装饰器的作用是将这些修改层层叠加并产生复合效果。

下面,我们就来一起学习如何使用 Python 中的装饰器函数。

一、装饰器函数的定义

装饰器函数实际上也是个函数,它是一个封装了被装饰的函数或者类的调用方式,并能够在一定程度上限制被装饰对象的输出的函数。

下面是一个简单的装饰器函数,它可以在被装饰对象的输出上添加一句问候语:

def hello_decorator(func):

    def wrapper():
        print("Hello, this is a decorated function.")
        func()
        print("Good bye, this is the end of the decorated function.")
      
    return wrapper

该函数接收一个函数作为参数,并返回另一个函数,这两个函数一般都是嵌套在一起的。内层函数 wrapper 将接收到的 func 函数包装起来,并在函数执行前后添加了一句问候语。最后,该函数返回了 wrapper 函数,也就是被加工了的、新的函数。

二、装饰器函数的使用

装饰器函数可以给被装饰的函数或者类添加一些额外的功能,这样可以避免代码的冗余。我们首先可以定义一个简单的函数:

def say_hello():
    print("Hello, World!")

然后,我们可以使用 hello_decorator 函数装饰该函数:

decorated_function = hello_decorator(say_hello)
decorated_function()

运行这段代码,你会发现输出结果如下:

Hello, this is a decorated function.
Hello, World!
Good bye, this is the end of the decorated function.

可以看到,通过装饰器函数将 say_hello 函数包装起来时,输出结果中增加了一句问候语。

三、使用装饰器来简化代码

在实际开发过程中,我们经常需要重用同一个函数的代码。在这种情况下,装饰器可以非常有用,用来加快开发过程并避免出现重复的代码。

比如我们有一个统计函数运行时间的需求,依次实现如下:

import time

def run_time(func):
    def wrapper(*args, **kw):
        start_time = time.time()
        res = func(*args, **kw)
        end_time = time.time()
        print(f"{func.__name__}函数运行时间为{end_time - start_time:.4f}秒")
        return res
    return wrapper

@run_time
def func_one():
    time.sleep(1)
    
@run_time
def func_two(n):
    time.sleep(n)
    
@run_time
def func_three(a, b):
    time.sleep(3)
    return a + b
    
a = func_one()
b = func_two(2)
c = func_three(1, 9)

print(a, b, c)

该代码中定义了一个装饰器函数 run_time,它可以在被装饰的函数执行前后计算函数运行时间,并输出结果。在上面的代码中,该装饰器被用于装饰三个不同的函数,并且这些函数的形式参数都不同,但是装饰器仍然可以正常工作。

我们可以看到,在这个例子中,装饰器大大简化了我们求运行时间这一常用操作的代码量。