装饰器对带有返回值的函数进行装饰
前面介绍的装饰器,都是对不带返回值的函数进行装饰,如果要对有返回值的函数进行装饰,那么该如何实现呢,先来看一段代码:
def test():
return 'itheima'
result = test()
print(result)
运行代码,结果如下所示:
itheima
上述代码创建了一个test()函数,并使用result变量保存调用test函数后的返回值。此时,如果我们对带有返回值的函数进行装饰,那么,调用test函数后,函数的返回值还能输出吗?下面我们编码来尝试。
def func(function_name):
def func_in():
function_name()
return func_in
@func
def test():
return 'itheima'
result = test()
print(result)
程序执行后,发现此时调用test()函数,函数没有返回值,也就是None。这是因为,当使用@func对test函数装饰后,test指向了func_in()函数,而fun_in()函数本身是没有返回值的,具体如图1所示。
图1 函数调用情况分析
在图1中,test指向了新的函数,原本test()函数的返回值被function_name()接收了。因此,如果想输出“itheima”,需要使用return语句将调用后的结果返回。对装饰函数进行修改,修改后的代码如下所示:
def func(function_name):
def func_in():
return function_name()
return func_in
@func
def test():
return 'itheima'
result = test()
print(result)
此时,再次调用test()函数,发现成功得到了返回值。
itheima