# 定义一个最简单的装饰器

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

增加@functools.wraps(f), 可以保持当前装饰器去装饰的函数的 __name__ 的值不变

以上输出结果就是:

num1

num2

python functools import wraps_python装饰器中functools.wraps的作用详解相关推荐

  1. python wraps_python装饰器中的@wraps

    第一段代码:没有添加@wraps def user_login_confirm(name): print('我是', name) def deco_fun(view_func): print('准备变 ...

  2. python find的使用方法_Python中的rfind()方法使用详解

    Python中的rfind()方法使用详解 rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[beg:end]. 语法 以 ...

  3. python创建列向量_关于Numpy中的行向量和列向量详解

    关于Numpy中的行向量和列向量详解 行向量 方式1 import numpy as np b=np.array([1,2,3]).reshape((1,-1)) print(b,b.shape) 结 ...

  4. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  5. python编程midi键盘按键_Python中捕获键盘的方式详解

    python中捕获键盘操作一共有两种方法 第一种方法: 使用pygame中event方法 使用方式如下:使用键盘右键为例 if event.type = pygame.KEYDOWN and even ...

  6. 正则表达式中模式修正符作用详解(i、g、m、s、x、e)

    正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或a ...

  7. python装饰器应用_Python装饰器实现方法及应用场景详解

    应用场景: 1.授权(Authorization) 装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint).它们被大量使用于Flask和Django web框架中.这里是一个 ...

  8. 装饰器是什么?一文详解装饰器原理及 Python 计时器实战

    在本文中,我将和大家一起了解装饰器的工作原理,如何将我们之前定义的定时器类 Timer 扩展为装饰器,以及如何简化计时功能.最后对 Python 定时器系列文章做个小结.喜欢记得收藏.关注.点赞. 文 ...

  9. python装饰器类型错误_Python各种类型装饰器?一起看看这份详解说明吧

    装饰器说明Python中的装饰器是一种可以装饰其它对象的工具. 该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数.类来实现. 装饰器本身需要接受一个被装饰的对象作为参数,该 ...

最新文章

  1. 代码覆盖测试工具Kcov简介及使用
  2. 详述一次大量删除导致MySQL慢查的过程
  3. pytorch构造可迭代的Dataset——IterableDataset(pytorch Data学习二)
  4. html音频自动播放隐藏控制器,HTML5 音频回放/播放控制器
  5. 文东工作室开通微信公众号了!欢迎订阅!~
  6. 山师计算机二级考试科目,山师计算机应用技术考试试题与答案.doc
  7. 室内布线电缆未来的发展趋势
  8. The system is running in low-graphics mode
  9. OCR文字识别技术总结(三)
  10. gridview中js的绑定问题 一个js的函数[转]
  11. HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
  12. 提高办公效率的方法-工具篇
  13. 数据库系统概论第五版_第二章:关系数据库
  14. 开源WebMail客户端Intouch2.2beta导致IE6崩溃的原因和修改方法
  15. 公交车查询系统软件测试,公交APP评测:谁是最好用的公交线路查询软件?
  16. c语言编译器怎么防止优化变量,volatile关键字的作用:防止变量被编译器优化
  17. 游戏编程该读哪些书?
  18. 抄送列表 ,处理邮件,年会抽奖
  19. 音乐歌单Android,LitePager(仿网易云音乐-歌单广场效果)
  20. 豆瓣top250图书爬取

热门文章

  1. html如何设置图片循环旋转动画效果,如何使用css3实现图片自动旋转的特效(完整代码)...
  2. 因果推断 - 反事实
  3. 洛谷 P2935 [USACO09JAN]最好的地方Best Spot
  4. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
  5. java servicefactory_Java DirectoryServiceFactory.getDirectoryService方法代碼示例
  6. java线程池深入讲解_死磕 java线程系列之线程池深入解析——生命周期
  7. 20211126 为什么转动惯量矩阵是正定的?
  8. Python3之多线程学习
  9. locate 和 find
  10. Linux 下源码编译安装 vim 8.1