博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器补充知识点_ @functools.wraps(func)
阅读量:5153 次
发布时间:2019-06-13

本文共 1950 字,大约阅读时间需要 6 分钟。

1 # -*- coding: utf-8 -*- 2  3 def log(func): 4     def wrapper(*args,**kwargs): 5         print('这个函数是 %s()'%func.__name__) 6         return func(*args,**kwargs) 7           8     return wrapper 9 # import functools10 # def log(text):11 #     def decorator(func):12 #         @functools.wraps(func)13 #         def wrapper(*args, **kw):14 #             #wrapper.__name__ = func.__name__15 #             print('%s 这个函数是 %s():' % (text, func.__name__))16 #             17 #             return func(*args, **kw)18 #         return wrapper19 #     return decorator20 21 # @log('hello')  #now=log('hello')(now)22 @log23 def now():24     print('2018-06-30')25     return 126     27 print(now())28 print(now.__name__)

结果:

这个函数是 now()2018-06-301wrapper

 

以上两种decorator的定义都没有问题,但还差最后一步。因为我们讲了函数也是对象,它有__name__等属性,但你去看经过decorator装饰之后的函数,它们的__name__已经从原来的'now'变成了'wrapper'

因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。

# -*- coding: utf-8 -*-def log(func):    def wrapper(*args,**kwargs):        wrapper.__name__ = func.__name__        print('这个函数是 %s()'%func.__name__)        return func(*args,**kwargs)             return wrapper@logdef now():    print('2018-06-30')    return 1    print(now())print(now.__name__)

结果:

这个函数是 now()2018-06-301now

 

不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的,所以,一个完整的decorator的写法如下:

1 # -*- coding: utf-8 -*- 2 import functools 3 def log(func): 4     @functools.wraps(func) 5     def wrapper(*args,**kwargs): 6 #         wrapper.__name__ = func.__name__ 7         print('这个函数是 %s()'%func.__name__) 8         return func(*args,**kwargs) 9          10     return wrapper11 12 @log13 def now():14     print('2018-06-30')15     return 116     17 print(now())18 print(now.__name__)

结果:

这个函数是 now()2018-06-301now

import functools是导入functools模块。模块的概念稍候讲解。现在,只需记住在定义wrapper()的前面加上@functools.wraps(func)即可。

 

转载于:https://www.cnblogs.com/Mengchangxin/p/9248238.html

你可能感兴趣的文章
2018/12/21 HDU-2077 汉诺塔IV(递归)
查看>>
dfs/bfs(转载)
查看>>
小生功能贴<一> --- 动态添加应用 具有长按删除功能
查看>>
【Apach shiro】spring 整合Apache shiro
查看>>
java获取当前上一周、上一月、上一年的时间
查看>>
图片代替滚动条 JS文件2
查看>>
HTML 学习笔记
查看>>
多项目上传文件解决方案之:Flash上传插件
查看>>
Linux相关学习笔记-文件系统
查看>>
《linux 内核全然剖析》sched.c sched.h 代码分析笔记
查看>>
Android学习之——优化篇(2)
查看>>
好的开源库总结
查看>>
Winform的Bitmap调色板的一个问题
查看>>
noframes,frame,iframe,frameset 区别
查看>>
Android统计绘图工具
查看>>
Isequal IsequalToString containsString hasPrefixd的区别
查看>>
【原】关于cuteftp连不上Linux虚拟机的问题
查看>>
大众点评cat系统的搭建笔记
查看>>
[svc]sort-uniq
查看>>
[svc]mysql备份恢复及常用命令
查看>>