带参数的装饰器,*args,**kwargs

带参数的装饰器,*args,**kwargs

没听懂,嵌套带参数的装饰器??魔法参数??add为什么生成列表、字典??

正在回答

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

3回答

同学你好:带参数的装饰器可能有一点难,不如我换一个例子讲讲。

首先是一个不带参数的装饰器run_time,我们可以通过这个装饰器计算函数运行的时间。如下图:

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

如果我们想为一个有参数的函数装饰run_time装饰器,则会报错,因为和装饰器中写的func()中参数不匹配:

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

因此我们需要对装饰器函数进行修改,使它可以接收参数。我们选择使用*args,**kwargs,这样无论被装饰的函数有几个参数,是否是关键字类型,都可以正确接收:

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

(run time为0.0的原因是运行时间过短,运行时间长的函数可正常输出)

不知道这么讲同学有没有觉得好懂了呢,建议同学可以多上手练习一下代码加深理解

如果解决了你的疑惑,请采纳,祝学习愉快~ 

  • 慕python_SD三德 提问者 #1
    你是上帝派来的吗??讲的那么精致!!厉害!!
    2020-03-29 15:07:09
好帮手慕觉浅 2020-03-29 12:47:53

同学你好:

1.*args,**kwargs是在第一阶段步骤二 · 3-10 函数的其他三种使用技巧一课中学到的序列传参和字典传参,可以接收多个参数。当他们一起使用时被称为魔法参数,可以传递不定长的、可用关键字也可不用关键字的参数,其中关键字参数被看作字典处理,无关键字的参数被看作元组处理。同学如果忘记了用法可以再看看课程复习一下。

2.并不是add()返回了列表和字典,而是用装饰器输出了add()的参数。使用序列传参的参数用元组进行输出,使用字典传参的参数用字典进行输出。如下图所示:

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

如果解决了你的疑惑,请采纳,祝学习愉快~ 


提问者 慕python_SD三德 2020-03-28 21:59:23

对了func(  ),  为什么在def函数后加return???

  • 同学你好:这里问的是装饰器中res = func(*args, **kwargs)后为什么要return res吗?因为装饰器中不return无法输出add()函数的返回值,我们为了输出函数的结果,需要用return返回。
    2020-03-29 13:11:10
  • func( )和带参数的装饰器没听懂
    2020-03-29 14:28:07
  • 就是想问一下为什么要那么多个return,return的是函数名(一定要函数名么?)
    2020-03-29 14:43:33
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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