2017-10-15 132 views
-2

我想了解python中的装饰器。我不明白为什么下面不工作:为什么这个python装饰器不工作?

def decorator(func): 
    def logger(*args, **kwargs): 
     print "start logging" 
     func(*args, **kwargs) 
     print "end logging" 
    return logger 

@decorator 
def add(a,b): 
    return a+b 

如果我打电话add(2,3)输出将是:

start logging 
end logging 

但是如果我在logger定义修改我的代码,写return func(*args, **kwargs)它可以工作,但是end logging没有写在输出上。

+3

函数在你返回时结束......分配调用函数的结果,然后*打印*然后返回结果。 – jonrsharpe

+1

'logger'函数*必须*返回'func'的值,但直到最后才能做到。现在想一下,你怎么可能保存'func'调用的结果,以后你可以'返回'? –

回答

4

您可以捕获在变量的返回值,并打印后返回它:

def decorator(func): 
    def logger(*args, **kwargs): 
     print "start logging" 
     result = func(*args, **kwargs) 
     print "end logging" 
     return result 
    return logger 

装饰都没有特殊的位置;它只是一个调用另一个函数的函数。