python3 装饰器修复技术@wraps到底是什么?

本文详细解析了Python装饰器@wraps的功能,解释了它如何保持被装饰函数的原始元信息,如函数名和文档字符串,避免了装饰器应用后的信息丢失,对于理解和使用高级装饰器具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰器里面再用一个装饰器@wraps是为什么呢?
在这里插入图片描述
本来上面是一个简单的登陆校验器(截图中注释写错了,不是校验密码),在用户登陆后台是校验是否已经电脑正常登陆,如下图所示:
在这里插入图片描述
但是我们注意到,在这个登陆校验装饰器中,又额外增加了一个装饰器@wraps,那这个装饰器是什么作用呢?根据我自己百度后理解的的结果就是:这个是用来还原函数两个变量值的:
1、显示 正在执行的函数的名称 f.name
2、显示 正在执行的函数的注释 f.doc
如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称
如果使用了@wraps,当A调用了装饰器B的话,A.__name__返回的会是A函数的名称,而不是饰器B的名称,这也即使常说的@wraps是装饰器的修复技术,实际就是修复还原了A的__name__变量,同理__doc__变量也是一样。
具体例子如下:

    # 普通函数:
    def f():
        """
        这是一个用来测试装饰器修复技术的函数
        """
        print("哈哈哈")
    
    if __name__ == '__main__':
        print("执行的函数名:", f.__name__)
        print("函数的注释:", f.__doc__)
    
    # 打印结果
       执行的函数名: f
       函数的注释: 这是一个用来测试装饰器修复技术的函数
  
  
	#添加装饰器,但不添加@wraps修复
    def wrapper(func):
        def inner(*args, **kwargs):
            print("在前面执行的代码。。。。")
            func()
            print("在后面执行的代码...")
        return inner
       
    @wrapper
    def f():
        """
        这是一个用来测试装饰器修复技术的函数
        """
        print("哈哈哈")
       
    if __name__ == '__main__':
        print("执行的函数名:", f.__name__)
        print("函数的注释:", f.__doc__)
    
    # 打印结果
       执行的函数名: inner
       函数的注释: None
    
    
	# 添加装饰器修复技术@wraps
    from functools import wraps
   def wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            print("在前面执行的代码。。。。")
            func()
            print("在后面执行的代码...")
        return inner
   
    @wrapper
    def f():
        """
        这是一个用来测试装饰器修复技术的函数
        """
        print("哈哈哈")
        
    if __name__ == '__main__':
        print("执行的函数名:", f.__name__)
        print("函数的注释:", f.__doc__)
    
    # 打印结果
        执行的函数名: f
        函数的注释: 这是一个用来测试装饰器修复技术的函数

例子来自:https://blog.csdn.net/aaronthon/article/details/81714521
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值