wrapper的__doc,__name__修改问题

wrapper的__doc,__name__修改问题

http://img1.sycdn.imooc.com//climg/5f3494400906c46006550317.jpg

为什么这两句写在这不生效啊,一定要写在return wapper之前才行吗

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕乃馨 2020-08-13 16:25:58

同学你好,在我第一个回答的截图中,我先使用了add然输出了name和doc,而同学的代码是先输出name和doc后使用add,这就导致return rest之前的代码没有执行。

http://img1.sycdn.imooc.com//climg/5f34f8310962a03805260876.jpg

http://img1.sycdn.imooc.com//climg/5f34f8ee092aa20005740853.jpg

如果我的回答解决了您的疑惑,请采纳,祝学习愉快~~~~


  • 提问者 慕粉4079888 #1
    那我这样写,为什么打印出来是add原本的doc和name呢,同样没有先调用add,而是直接print的 from functools import wraps def log(name=None): def decoration(func): # @wraps(func) def wapper(*args, **kwargs): # 可接收被装饰器的参数 '''wapper的doc''' print('{0}开始...'.format(name)) rest = func(*args, **kwargs) print('{0}结束...'.format(name)) return rest # 返回装饰器的返回值 wapper.__doc__ = func.__doc__ wapper.__name__ = func.__name__ return wapper # 返回装饰器函数 return decoration #返回装饰器最外层函数 @log('add') def add(a,b): '''add函数doc''' return a+b if __name__ == '__main__': print('doc:{0}'.format(add.__doc__)) print('name:{0}'.format(add.__name__)) rest = add(1,2) print(rest) 打印是这样的: doc:add函数doc name:add add开始... add结束... 3
    2020-08-13 16:37:26
  • 好帮手慕乃馨 回复 提问者 慕粉4079888 #2
    因为 wapper.__doc__ = func.__doc__和 wapper.__name__ = func.__name__都在return rest之后,前面的无论执不执行,这两句都会执行,然后return wapper。
    2020-08-13 16:41:42
提问者 慕粉4079888 2020-08-13 16:01:50

我的代码是这样的:

from functools import wraps


def log(name=None):
   def decoration(func):
       def wapper(*args, **kwargs):
           '''wapper的doc'''
           print('{0}开始...'.format(name))
           rest = func(*args, **kwargs)
           wapper.__doc__ = func.__doc__
           wapper.__name__ = func.__name__
           print('{0}结束...'.format(name))

           return rest

       return wapper  # 返回装饰器函数
   return decoration  #返回装饰器最外层函数


@log('add')
def add(a,b):
   '''add函数doc'''
   return a+b


if __name__ == '__main__':
   print('doc:{0}'.format(add.__doc__))
   print('name:{0}'.format(add.__name__))
   rest = add(1,2)
   print(rest)

运行截图是:

http://img1.sycdn.imooc.com//climg/5f34f2e2092d38c502270144.jpg

打印的是装饰器里的doc和name


如果我装饰器这样写:

http://img1.sycdn.imooc.com//climg/5f34f347092f2f1a05650349.jpg

打印结果是这样的:

http://img1.sycdn.imooc.com//climg/5f34f359097b821401880138.jpg

打印的是被装饰的add函数的doc和name

好帮手慕乃馨 2020-08-13 11:14:08

同学你好。

1.如果注释掉这两句,输出是装饰器的name和doc:

http://img1.sycdn.imooc.com//climg/5f34ae96099e0b0d05730765.jpg

加上这两句话输出的是add的name和doc:

http://img1.sycdn.imooc.com//climg/5f34aef109e06feb06060754.jpg

这两句话对于修改name和doc是生效的,不知道同学想达到什么效果,可以具体描述吗?

2.若将这两句话放在return wapper之后会报错,因为wapper已经被返回,decoration方法无法使用wapper:

http://img1.sycdn.imooc.com//climg/5f34afab09ca73a304740389.jpg

如果我的回答解决了您的疑惑,请采纳,祝学习愉快~~~~

  • 提问者 慕粉4079888 #1
    我这边代码,如果加上红框里的两句话,输出的还是wapper里的doc和name...
    2020-08-13 13:47:00
  • 好帮手慕乃馨 回复 提问者 慕粉4079888 #2
    同学你好,可以截图或者复制所有的代码,为你做具体解答。
    2020-08-13 15:54:04
  • 提问者 慕粉4079888 回复 好帮手慕乃馨 #3
    我重新开一个问题吧 回复这里不能放图片
    2020-08-13 15:55:09
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师