Python的装饰器原来是这么用的-续

关注我的微信公众号:pythonislover,领取python,大数据,SQL优化相关视频资料!~

Python大数据与SQL优化笔 QQ群:771686295

上篇文章说到Python的装饰器,文尾留了一个彩蛋,不知道大家有没有发现那段装饰器代码还有没有其他问题。

Python的装饰器原来是这么用的

今天给大家揭晓下。首先上代码

​​​​​​​

def add_log(func):    def wrapper(*args,**kwargs):        print('我们要加一些日志')        func(*args,**kwargs)    return wrapper
@add_logdef f1(name):    print('普通函数 %s' %name)
@add_logdef f2(name,age):    print('我是%s,我%s岁了' %(name,age))
f1('python')f2('java',10)
结果:我们要加一些日志普通函数 python我们要加一些日志我是java,我10岁了

上篇说到了我们的功能函数可能会有参数,而且不同的功能函数可能有不同的参数,所以我们加上了*args,**kwargs来接受,这样参数的问题就解决了(功能函数就是上文的f1(), f2())

那你有没有发现f1() ,f2()没有返回值呢? 就是return, 因为在Python里一个函数的结果可以赋值给一个变量,这就是一些皆变量的意思。

​​​​​​​

def add_log(func):    def wrapper(*args,**kwargs):        print('我们要加一些日志')        func(*args,**kwargs)        return     return wrapper
@add_logdef f1(name):    print('普通函数 %s' %name)    return 'python'
@add_logdef f2(name,age):    print('我是%s,我%s岁了' %(name,age))    return 'java'
s1=f1('python')s2=f2('java',10)print(s1)print(s2)

结果:我们要加一些日志普通函数 python我们要加一些日志我是java,我10岁了NoneNone

现在如果我把f1, f2赋值给变量s1 s2, 虽然f1,f2里面都有reture,但是结果是s1,s2全是None, 那我们怎么给函数加上返回值呢?

看下面

​​​​​​​

def add_log(func):    def wrapper(*args,**kwargs):        print('我们要加一些日志')        s=func(*args,**kwargs)        return s    return wrapper
@add_logdef f1(name):    print('普通函数 %s' %name)    return 'python'
@add_logdef f2(name,age):    print('我是%s,我%s岁了' %(name,age))    return 'java'
s1=f1('python')s2=f2('java',10)print(s1)print(s2)
结果:我们要加一些日志普通函数 python我们要加一些日志我是java,我10岁了pythonjava

其实很简单,大家看出我改了什么了吗?

就是两行

        s=func(*args,**kwargs)        return s

在装饰器里捕获下返回值,OK了,这样我们一个完整的Python装饰器就大功告成了。

猜你喜欢

转载自blog.csdn.net/yrg5101/article/details/88915008