如何使用 functools 模块编写装饰器

2023-03-31 00:00:00 模块 编写 如何使用

functools 模块提供了许多有用的工具,包括编写装饰器所需的工具。下面是一个使用 functools 模块编写装饰器的示例:

import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("Calling decorated function")
        func(*args, **kwargs)
    return wrapper

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

say_hello("pidancode.com")

在上面的代码中,我们定义了一个名为 my_decorator 的装饰器函数。这个装饰器函数将被用来装饰 say_hello 函数,以便在每次调用 say_hello 函数时打印一条消息。

my_decorator 函数的参数是被装饰的函数 func。它返回一个新函数 wrapper,这个函数会在调用 func 前后执行一些额外的操作。

在 wrapper 函数中,我们使用 print 函数输出了一条消息,并调用了原始函数 func。注意,我们使用了 args 和 *kwargs 来接收任意数量的位置参数和关键字参数,并将它们传递给 func。

为了保留原始函数的元数据,如名称、文档字符串和参数列表,我们使用了 functools.wraps 装饰器。这个装饰器会将 wrapper 函数的元数据设置为 func 函数的元数据。

最后,我们使用 @my_decorator 语法将 say_hello 函数装饰上 my_decorator 装饰器。当我们调用 say_hello("pidancode.com") 时,会打印出以下消息:

Calling decorated function
Hello, pidancode.com!

这就是使用 functools 模块编写装饰器的基本示例。当然,这只是装饰器的一个简单示例,你可以编写更复杂的装饰器来完成各种任务。

相关文章