万能装饰器

###万能装饰器

# 装饰前的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")

猜你喜欢

转载自blog.csdn.net/qq_42708830/article/details/83154219