完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天进入第五天学习了,学到 了装饰器,decorator,结尾有个练习:
请编写一个decorator,能在函数调用的前后打印出 'begin call' 和 'end call' 的日志。 再思考一下能否写出一个 @log 的decorator,使它既支持: @log def f(): pass 又支持: @log('execute') def f(): pass decorator装饰器作用和用法,我不在这里多说,大家自己看资料。 开始分析练习的第一个要求,只要能打印出来就行,于是把廖老师的例程拷贝过来,增加2个print即可 import functools def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print 'begin:' result = func(*args, **kw) print 'end' return result return wrapper return decorator @log('execute') def now(): print '2017-12-22' print now() 这个例程,我自己实践过,拷贝即可运行了。其实在看到题的第一刻,我有个想法,如何实现把 'begin call' 和 'end call'当做输入变量传进去,然后按这个要求打印,目前还没研究出来,我的目的是这样 import functools def log(str1,str2): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): # print 'begin:' print '%s ' % (str1) result = func(*args, **kw) # print 'end' print '%s ' % (str2) return result return wrapper return decorator @log('begin call','end call') def now(): print '2017-12-22' print now() 这个实现2个输入的,如果想实现N多个,我一直没有好的思路,大家有好的建议,给兄弟回复一下,谢谢。 下面开始研究: 写出一个 @log 的decorator,使它既支持: @log def f(): pass 又支持:@log('execute') def f(): pass 正研究,搞定了,补充 进入第六天的学习,今早,我突然有个灵感,把参数设置为默认,里面再加个判断不就可以通用了吗? import functools def log(str=None): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): if(str != None): print '%s ' % (str) else: print '%s %s():' % (str, func.__name__) return func(*args, **kw) return wrapper return decorator @log() def now(): print '2017-12-22' print now() 果然运行成功了,太兴奋了,给大家共享本思路。 很多时候遇到困难,不能解决,不如先放下,换换脑子,说不定会有突发的灵感哦。 发帖与 2017年12月22日 更改与 2017年12月23日 评分
|
||
相关推荐 |
||
只有小组成员才能发言,加入小组>>
39个成员聚集在这个小组
加入小组3377 浏览 0 评论
5992 浏览 0 评论
2300 浏览 0 评论
5296 浏览 0 评论
1936 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:45 , Processed in 0.533098 second(s), Total 52, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号