装饰器
想弄明白装饰器,必须要知道什么是闭包
写个简单的小代码
def check(func):
def inner():
print("验证通过")
func()
return inner
@check
def f1():
print("我是f1")
f1()
打印结果
很明显,执行f1的时候,是先走的inner函数,那我们看一下原理
第一,红线,(语法糖)这个@check就相当于 执行check函数 ,并将 @check下面的函数作为check函数的参数,即:@check等价于 check(f1)
第二,黄线,函数名f1当做参数传进了check又在inner里面被调用,那check现在的返回值给谁呢,给了新的f1(),所以现在调用f1就不单单是执行自己了,得先执行inner里面的代码.
重点就是@check 这个装饰器一加 那函数就是f1 = check(f1)
最后放一下带参数的装饰器
def test(f):
def inner(*args, **kwargs):
print("a")
f(*args, **kwargs)
return inner
@test
def f1(x, y):
print(x, y)
f1(3,2)