###万能装饰器
# 装饰前的test(最先定义的test)是由func指向
# 装饰后的test其实就是call_fun
# 装饰器在道德上不会去更改原先函数的返回值,不会去更改原先的参数
# call_fun,func,test这三个参数一般保持一致
def set_fun(func):
def call_fun(*args,**kwargs):
print("--->args",args)
print("--->kwargs",kwargs)
return func(*args,**kwargs) # 拆包
return call_fun
@set_fun # fun1 = set_fun(fun1)
def fun1(*args, **kwargs):
print(args)
print(kwargs)
return 100
print(fun1())
print(fun1(123,456))
print(fun1(123, 456, a=1, b=2))
###装饰器传参
# 三个函数的嵌套,最外层(第三层必须返回闭包的引用),最外层必须的参数
def set_value(value):
print(value)
def set_fun(func):
def call_fun():
print("权限认证")
func() # 这个就是原先的函数
return call_fun
return set_fun
# 这个分成两步
# 第一步:set_value("吃饭"),得到闭包的的引用
# 第二步:@闭包的引用 @set_fun ===> test=set_fun(test)
@set_value("吃 饭")
def fun1():
print("test")