python装饰器用来扩展原来函数功能,能让函数在不做任何变动的情况下增加某些额外的功能
比如插入日志、性能测试、时间测试等等
装饰器的返回值也是一个函数对象
在了解装饰器之前我们先来了解一下python中的*和**
下面请看代码:
def mul(*args): for value in args: print("args:", value) print(args) print(*args) def mul2(**kw): for key, value in kw.items(): print(key + ":" + value) print(kw) print(*kw) if __name__ == '__main__': mul(1,'a',True) print('\n') mul2(name='Tony', age='20', single='True')
程序截图:
看见程序后应该有点意思了吧,*号就像一只手一样,把你要用到的数据抓出来
其实概括性的就两句话:
一个星(*):表示接收的参数作为tuple来处理
两个星(**):表示接收的参数作为dict来处理
接下来看一个没有参数的简易装饰器,让大家了解一下装饰器的功能:
def decorator(func): def wrapper(): print('start {}'.format(func.__name__)) return wrapper @decorator def func_a(): pass @decorator def func_b(): pass def func_c(): pass func_c = decorator(func_c) # decorator装饰器和这句功能一样
这个装饰器很简单,就是在每个函数运行时都打印start+函数名
再来看每个函数运行截图:
看到func_c函数运行起来和a、b没什么区别
一般的装饰器都得携带或多或少的几个参数,同时加上*args和**kw的话我们就不用担心收到的是个tuple还是dict了
也不管收到的有几个参数,如果tuple和dict混杂起来,得保证tuple的参数在前面
程序如下:
def decorator(func): def wrapper(*args, **kw): print('start {}'.format(func.__name__)) return func(*args, **kw) return wrapper @decorator def func_a(a, b): return a + b @decorator def func_b(a, b, c): return a + b + c @decorator def func_c(a=5, b=3): return a - b @decorator def func_d(a, b=3, c=5): return a - b + c
我给的例子还是比较典型的,一个tuple,一个三个参数的tuple,一个dict,还有一个tuple混dict
程序运行截图: