如何使用 functools 模块编写装饰器
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 模块编写装饰器的基本示例。当然,这只是装饰器的一个简单示例,你可以编写更复杂的装饰器来完成各种任务。
相关文章