学科分类
目录
基础

装饰器对带有返回值的函数进行装饰

前面介绍的装饰器,都是对不带返回值的函数进行装饰,如果要对有返回值的函数进行装饰,那么该如何实现呢,先来看一段代码:

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所示。

image-20200616152310426

图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
点击此处
隐藏目录