首页 > python的装饰器返回值问题

python的装饰器返回值问题

为什么代码中得activate函数里面的wrapped函数中的try语句里面要return func呢


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 中的语句总是会执行的,不管是发生异常,还是你说要返回了。

【热门文章】
【热门文章】