装饰器
第一个函数,作用是返回所有参数
def func1(*args): return (args) print(func1(2,3,4)) #输出的是(2, 3, 4),return多个值返回的是个元祖
假如需要加上一个功能,不仅返回所有参数,还要返回所有参数的和(假设所有参数是数字)
#加个功能 算出所有参数的和 def deco_demo(f): def wrapper(*args): f(*args) j=0 for i in args: j+=i return f(*args),('所有的数字的和为',j) return wrapper @deco_demo def func1(*args): return (args) print(func1(2,3,4)) #输出为:((2, 3, 4), ('所有的数字的和为', 9))
假如还要加入一个功能,计算所有参数的乘积(假设所有参数是数字)
#加个功能 算出所有参数的和 def deco_demo(f): def wrapper(*args): f(*args) j=0 for i in args: j+=i return f(*args),('所有的数字的和为',j) return wrapper #加个功能 算出所有参数的乘积 def deco_demo2(f): def wrapper(*args): f(*args) j=1 for i in args: j*=i return f(*args),('所有的数字的积为',j) return wrapper @deco_demo2 @deco_demo def func1(*args): return (args) print(func1(2,3,4)) #输出:(((2, 3, 4), ('所有的数字的和为', 9)), ('所有的数字的积为', 24))
装饰器调用顺序
装饰器是可以叠加使用的,那么使用装饰器以后代码是啥顺序呢?
对于Python中的”@”语法糖,装饰器的调用顺序与使用 @ 语法糖声明的顺序相反。