什么是装饰器:
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。 它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
案列:现在有一个购买功能,但购买之前需要用户登录后才能购买商品,需要在不修改源代码的情况下实现此功能
def buy():
print("购买商品")
使用装饰器:
def login(fun):
def inner():
print("校验完成,登陆成功")
fun()
return inner
@login #相当于buy=login(buy)
def buy():
print("购买商品")
buy()
#输出
校验完成,登陆成功
购买商品
可用多个装饰进行装饰
原则:从上到下装饰,从下到上执行
装饰器传参
1.一个参数
def login(fun):
def inner(n):
print("校验完成,登陆成功")
fun(n)
return inner
@login #相当于buy=login(buy)
def buy(n):
print("购买商品"*n)
buy(2)
2.多个参数
def login(fun):
def inner(*args,**kwargs):
print("校验完成,登陆成功")
print(args,kwargs)
fun(*args,**kwargs)
return inner
@login #相当于buy=login(buy)
def buy1(n):
print("购买商品"*n)
@login
def buy2(n1,n2,n3):
print("购买商品" * n1*n2)
print("-"*n3)
buy1(3)
print("="*30)
buy2(2,3,n3=44)
#输出
校验完成,登陆成功
(3,) {}
购买商品购买商品购买商品
==============================
校验完成,登陆成功
(2, 3) {'n3': 44}
购买商品购买商品购买商品购买商品购买商品购买商品
--------------------------------------------
装饰器返回值
def login(fun):
def inner(*args,**kwargs):
print(args,kwargs)
res=fun(*args,**kwargs)
return res
return inner
@login #相当于buy=login(buy)
def buy3(n1,n2,n3):
print(n1,n2,n3)
return n1+n2+n3
res=buy3(3,4,n3=5)
print(res)
#输出
(3, 4) {'n3': 5}
3 4 5
12