为了账号安全,请及时绑定邮箱和手机立即绑定

搞不明白为什么里面返回r,外面返回fn,这个装饰器用在这里有啥好处,看着好乱。。。。

搞不明白为什么里面返回r,外面返回fn,这个装饰器用在这里有啥好处,看着好乱。。。。

正在回答

5 回答

姑娘,你不要看里面返回个r,外面返回个fn,好像很麻烦的样子。你要看对齐方式。拿我上面的例子来说,outer这个函数执行的时候,你就看比它的定义缩进2格的那些行,也就是1和3,1是定义了另一个inner函数,3是返回这个inner函数。那3再执行的时候呢,就看定义inner这个函数(也就是1)缩进2格的那些行,就是2了。

之所以外层包里层,层与层之间是步步深入的。

5 回复 有任何疑惑可以回复我~
#1

慕神2455362

理解得太棒了,感谢 哦
2019-07-26 回复 有任何疑惑可以回复我~

装饰器的本质是闭包。

def outer(f):

    def inner(x):    #1

        return f(x)    #2

    return inner    #3

f = out(f)

f(x)

看上面这个函数,我先定义一个outer函数,这个函数的1,2,3行都做了些什么呢?首先1,2两行我定义另一个函数,但是先不执行,我先放在这,后面用的时候再执行。然后我把定义的这个inner函数返回去。接下来调用的时候,inner函数再执行。那inner函数都干什么事呢?执行f(x)函数并返回结果。

所以为什么定义了outer inner这俩函数,结果就是为了执行f(x)这个函数呢?费那么大劲干嘛?就是为了在1和2之间插入点其它东西,比如print点东西出来。这就是装饰器了。

7 回复 有任何疑惑可以回复我~

在本次练习中,为了得到运行阶乘函数的运行时间,所以在它运行前记录个时间,运行后记录个时间,一减就知道耗费了多少时间,r其实只是一个临时变量,把阶乘函数实际运行的结果保存了下来。这个题目要求的既要输出耗费的时间,又要输出阶乘的结果,时间已经实现了,结果就保存在了r这个变量里面,最后直接返回r就可以了。


如果没有这个r,最后想要阶乘的结果,就得再执行一遍阶乘函数。假如要计算的是几万几十万的阶乘,耗费的时间假如说有一个小时,那计算耗费时间,花了一个小时,最后再执行结果,又花了一个小时,时间成本就太高了。

1 回复 有任何疑惑可以回复我~

结合之前学过的闭包的内容,闭包实际上就是指两层函数,一层包着一层,外面那层传参数给里面那层用,这样做的意义是,要想用里层的函数,只能通过外层,不能直接使用,也就起到了保护的作用。装饰器在闭包的基础上,增加了实际的意义,比如用外层的函数辅助输出一些内容,像print一些日志出来,或者计算内部函数调用的时间,说到底是为内层函数服务的。

而且装饰器不是为某一个函数服务的,而是为所有函数服务的,是一个通用的东西。里层的函数该怎么运行怎么运行,装饰器只是协助实现了某些辅助的功能,这也会它为什么叫装饰器,只是达到某种装饰的功能。

7 回复 有任何疑惑可以回复我~
#1

猴子七号

感谢大佬!!!
2019-12-05 回复 有任何疑惑可以回复我~

面向切面编程使用的,有些东西特别是log日志,可能每个方法都需要输出日志,这样容易查清那个方法出现了问题。但是如果每个方法里面都打印一句话编程时会显的很麻烦,所以通过切面来编程。

至于为什么如此返回,我看不到你遇到问题的具体代码,所以,只能给你推荐一个思路,就是按电脑的思路一句一句去执行他,这样容易理解代码。不要一目十行

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

搞不明白为什么里面返回r,外面返回fn,这个装饰器用在这里有啥好处,看着好乱。。。。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信