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

如何使用装饰器函数来修饰Python函数?

发布时间:2023-05-20 21:14:01

装饰器是Python中一个非常重要和强大的概念,允许一个函数在不改变其代码或定义的情况下被修改、增强或包装。装饰器自身是一个函数,由这个函数定义另一个函数(可能是原始函数,也可能是一个新的函数),并返回后者。在函数指定的位置上,使用@语法糖即可将 装饰器应用到原始函数上。在解释器运行函数之前,会将原始函数的引用传递给装饰器,并将其结果赋给原始函数的引用。这样就可以安排和执行函数的附加代码,从而实现装饰器的目的。

下面是一个简单的装饰器的示例:

def my_decorator(original_function):
    def wrapper(*args, **kwargs):
        print('Before the function is called.')
        result = original_function(*args, **kwargs)
        print('After the function is called.')
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f'Hello, {name}!')

say_hello('Tom')

输出:

Before the function is called.
Hello, Tom!
After the function is called.

装饰器函数my_decorator接收一个参数original_function,它本身就是一个函数。 这个函数的返回值是另一个函数wrapper。wrapper函数封装了original_function函数,它的主体可以包含任何附加的代码。在这个例子中,wrapper函数将在函数被执行之前和之后打印一条消息。 wrapper函数接受*args和**kwargs参数,这使得可以将这个装饰器应用到任何函数上,而不必关心原始函数的参数列表。

使用@my_decorator语法将装饰器应用到原始函数say_hello上。这样,在调用函数时,实际上是调用了在my_decorator内定义的wrapper函数。wrapper函数将在函数被调用之前和之后打印消息,并最终将结果返回给调用者。

我们可以在调用其他函数之前和之后做很多事情,如计算处理时间或记录函数的调用。另外, 还可以使用多个装饰器来嵌套修改。

def timing_decorator(original_function):
    import time

    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = original_function(*args, **kwargs)
        end_time = time.time()
        print(f'Time elapsed: {end_time - start_time:.2f} seconds')
        return result
    return wrapper

@timing_decorator
@my_decorator
def say_hello(name):
    print(f'Hello, {name}!')
    time.sleep(1)

say_hello('Tom')

输出:

Before the function is called.
Time elapsed: 1.001 seconds
After the function is called.

这个示例展示了两个装饰器如何嵌套使用来修改函数。在这个例子中,一个新的装饰器timing_decorator计算函数的执行时间,并将其打印到屏幕上。

通过学习装饰器的基本语法和用法,它将为你打开一扇新的大门,帮助你更加方便地组织和管理你的代码。它还是Python中一种灵活的编程工具,可以适应许多不同的应用程序场景。