代码执行逻辑为是什么样子的?
我加了几句输出语句想看看decorator中的代码如何运行的:
但是结果我不太明白,还有一个问题为什么我输出f的时候啥都没有?f不应该是fectorial(10)这个函数么 ?
还有一个问题,这个写法是固定的么?(第一个函数参数是@xxx(a)的a,第二个函数参数一定是@xxx修饰的函数,第三个函数的参数一定是函数factorisl的参数)?
这些地方有点不太明白,请教大佬可否帮我理解一下...
我加了几句输出语句想看看decorator中的代码如何运行的:
但是结果我不太明白,还有一个问题为什么我输出f的时候啥都没有?f不应该是fectorial(10)这个函数么 ?
还有一个问题,这个写法是固定的么?(第一个函数参数是@xxx(a)的a,第二个函数参数一定是@xxx修饰的函数,第三个函数的参数一定是函数factorisl的参数)?
这些地方有点不太明白,请教大佬可否帮我理解一下...
2020-03-09
对于第一个问题:
可以解析代码的执行过程
@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 即函数别名 即是第二层要返回的装饰后的函数
举报