关注我的微信公众号:pythonislover,领取python,大数据,SQL优化相关视频资料!~
Python大数据与SQL优化笔 QQ群:771686295
上篇文章说到Python的装饰器,文尾留了一个彩蛋,不知道大家有没有发现那段装饰器代码还有没有其他问题。
今天给大家揭晓下。首先上代码
def add_log(func):
def wrapper(*args,**kwargs):
print('我们要加一些日志')
func(*args,**kwargs)
return wrapper
@add_log
def f1(name):
print('普通函数 %s' %name)
@add_log
def 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_log
def f1(name):
print('普通函数 %s' %name)
return 'python'
@add_log
def f2(name,age):
print('我是%s,我%s岁了' %(name,age))
return 'java'
s1=f1('python')
s2=f2('java',10)
print(s1)
print(s2)
结果:
我们要加一些日志
普通函数 python
我们要加一些日志
我是java,我10岁了
None
None
现在如果我把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_log
def f1(name):
print('普通函数 %s' %name)
return 'python'
@add_log
def f2(name,age):
print('我是%s,我%s岁了' %(name,age))
return 'java'
s1=f1('python')
s2=f2('java',10)
print(s1)
print(s2)
结果:
我们要加一些日志
普通函数 python
我们要加一些日志
我是java,我10岁了
python
java
其实很简单,大家看出我改了什么了吗?
就是两行
s=func(*args,**kwargs)
return s
在装饰器里捕获下返回值,OK了,这样我们一个完整的Python装饰器就大功告成了。