ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python - 装饰器之 @functools.wraps(func)

2021-04-12 17:32:45  阅读:212  来源: 互联网

标签:__ wraps 函数 Python functools wrapper 装饰 def


@functools.wraps(func)

用在装饰器函数之上,用于写装饰器时,保留原有函数的名称和函数属性。

  # 定义一个最简单的装饰器
  def user_login_data(f):
    def wrapper(*args, **kwargs):
      return f(*args, **kwargs)
    return wrapper

  # 用装饰器装饰以下两个函数
  @user_login_data
  def num1():
    print("aaa")

  @user_login_data
  def num2():
    print("bbbb")

  if __name__ == '__main__':
    print(num1.__name__)
    print(num2.__name__)
 #以上代码的输出结果为:
    wrapper
    wrapper

由此函数使用装饰器时,函数的函数名即 __name__已经被装饰器改变.

一般定义装饰器的话可以不用考虑这点,但是如果多个函数被两个装饰器装饰时就报错,因为两个函数名一样,第二个函数再去装饰的话就报错.

解决方案就是引入  functools.wraps  ,以上代码的解决如下: 

    def user_login_data(f):
    @functools.wraps(f)
      def wrapper(*args, **kwargs):
        return f(*args, **kwargs)
      return wrapper

    # 输出结果:
    num1
    num2

标签:__,wraps,函数,Python,functools,wrapper,装饰,def
来源: https://www.cnblogs.com/blitheG/p/14648990.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有