m0_67001348 2023-02-24 21:56 采纳率: 88.9%
浏览 18
已结题

python 装饰器 functools.wraps的用法


def fun1(func):
    @functools.wraps(func)  # 1
    def fun2():
        func()
        print(11)

    return fun2


def fun4(func):
    @functools.wraps(func) # 2
    def fun5():
        print(12)
        func()

    return fun5


@fun4
@fun1
def fun3():
    print(13)


print(fun3.__name__)

同志们 我如果去掉1就会打印fun2 但是我去掉2 去打印的是fun5 为什么呀

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-24 22:41
    关注

    基于Monster 组和GPT的调写:
    functools.wraps 是一个装饰器,用于将被装饰函数的元信息,如 __name__、__doc__、__module__,等等,复制到装饰器函数中,以便更好地保留被装饰函数的元信息。

    在你的代码中,装饰器 fun1 和 fun4 都使用了 functools.wraps,并将被装饰的函数 func 作为参数传递给了 functools.wraps。

    如果你去掉 @functools.wraps(func) 中的任何一个,就会影响最终的被装饰函数的元信息。具体来说:

    如果你去掉装饰器 fun1 中的 @functools.wraps(func),则 fun3.name 的值将变成 fun2,因为此时 fun2 成为了最终的被装饰函数,而 fun2 是 fun1 中的内部函数。
    如果你去掉装饰器 fun4 中的 @functools.wraps(func),则 fun3.name 的值将变成 fun5,因为此时 fun5 成为了最终的被装饰函数,而 fun5 是 fun4 中的内部函数。
    因此,无论是装饰器 fun1 还是 fun4 中都必须包含 @functools.wraps(func),以保持最终被装饰函数的元信息正确。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 已采纳回答 2月26日
  • 创建了问题 2月24日

悬赏问题

  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作