84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
为什么代码中得activate函数里面的wrapped函数中的try语句里面要return func呢
ringa_lee
因为一个被装饰的函数通常被期望与没有被装饰的时候返回一样的东西。那里返回的就是未被装饰的函数的调用结果。至于 try,因为那个装饰器要做清理。finally 中的语句总是会执行的,不管是发生异常,还是你说要返回了。
Python中装饰器类似面向切面编程(AOP)中的Around advice(详细可以参考:http://docs.spring.io/spring/docs/2.0.8/reference/aop.html) 你上面这段代码在调用run函数的时候其实是调用了activate函数返回的wrapped函数,然后wrapped函数中的func变量是在test_simple中定义的run函数。也就是说如果你在activate函数中不写“return func()”的话,那么根本不会调用test_simple中定义的run函数。 如果上面的代码翻译成JavaScript的话大意会是如下:
var run = activate(function(){ // run函数中的代码 }) function activate(func) { return function() { // wrapped中的代码 return func(); } }
也就是说你在test_simple中调用的run函数其实已经是一个被替换掉的另外一个函数,这个替换的函数就是activate函数中返回的函数。
因为一个被装饰的函数通常被期望与没有被装饰的时候返回一样的东西。那里返回的就是未被装饰的函数的调用结果。至于 try,因为那个装饰器要做清理。finally 中的语句总是会执行的,不管是发生异常,还是你说要返回了。
Python中装饰器类似面向切面编程(AOP)中的Around advice(详细可以参考:http://docs.spring.io/spring/docs/2.0.8/reference/aop.html)
你上面这段代码在调用run函数的时候其实是调用了activate函数返回的wrapped函数,然后wrapped函数中的func变量是在test_simple中定义的run函数。也就是说如果你在activate函数中不写“return func()”的话,那么根本不会调用test_simple中定义的run函数。
如果上面的代码翻译成JavaScript的话大意会是如下:
也就是说你在test_simple中调用的run函数其实已经是一个被替换掉的另外一个函数,这个替换的函数就是activate函数中返回的函数。