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

代码执行逻辑为是什么样子的?

我加了几句输出语句想看看decorator中的代码如何运行的:

http://img1.sycdn.imooc.com//5e6612ce0001335912310764.jpg

但是结果我不太明白,还有一个问题为什么我输出f的时候啥都没有?f不应该是fectorial(10)这个函数么 ?

还有一个问题,这个写法是固定的么?(第一个函数参数是@xxx(a)的a,第二个函数参数一定是@xxx修饰的函数,第三个函数的参数一定是函数factorisl的参数)?

这些地方有点不太明白,请教大佬可否帮我理解一下...

正在回答

2 回答

对于第一个问题:

可以解析代码的执行过程

@decorator('ms')  其实就等于factorial = decorator('ms')(factorial)

factorial = decorator('ms')(factorial)这句代码 执行是先执行decorator('ms')按返回 su函数名-->接着执行su(f) 返回ssu函数名   到这里就等于   factorial=ssu

之后调用factorial 其实是调用ssu 即factorial(10)  ->ssu(10)

而在ssu 的执行顺序是  print "x=",x  …… return r   -->执行 factorial(10)的原函数

所以整个执行就是你的输出结果


第二问题嘛,写法应该是固定的 不过函数名是可变的。当然咱不是大佬,所以如果有其它的特殊用法也就不太清楚了。

原因嘛就是 :

第一层def  即标签名函数 要传参

第二层def  即装饰器函数 要传被装饰的函数名

第三层def 即函数别名  即是第二层要返回的装饰后的函数




1 回复 有任何疑惑可以回复我~
直接在页面上输出f是不会有结果的,在编译器环境下会输出f的函数类型,不会输出f的名字,要知道输出的f是什么可以用f.__name__。

f只是装饰器定义的一个参数,可以改成其他的非关键字,比如func1,f1等。

第一层函数是调用装饰器时传入的参数(unit/ms/s),第二层函数传入的是调用装饰器的函数(factorial),第三层函数传入的是调用装饰器的函数(factorial)的参数(n)。

以上是我的理解。。
0 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

代码执行逻辑为是什么样子的?

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