查看多个装饰器的调用顺序
def decorator_a(fun):
print('Get in decorator_a')
def inner_a(*args, **kwargs):
print('Get in inner_a')
res = fun(*args, **kwargs)
return res
return inner_a
def decorator_b(fun):
print('Get in decorator_b')
def inner_b(*args, **kwargs):
print('Get in inner_b')
res = fun(*args, **kwargs)
return res
return inner_b
@decorator_b
@decorator_a
def f(x):
print('Get in f')
return x * 2
print(f(2))
代码;
运行:
执行顺序是先从上到下读@decorator_b和 @decorator_a,然后在进一步执行@decorator_b @decorator_a装饰器内部函数,这时候的执行顺序是按照装饰器被调用的顺序,也就是先执行@decorator_b然后执行@decorator_a
让我们再看一个简单的例子:
查看运行结果:
执行顺序应该是这样的inner_a(inner_b(fun()))
首先执行最里面的函数fun( ),打印了---3----,然后执行外面一层函数b( ),打印----b----,返回b的值,因为第一个装饰器里面的函数a( )调用了内函数b( ),所以紧跟着执行a( ),之后没有内函数的调用,从上往下执行,先打印----1----,再打印----a----,执行顺序与执行结果顺序刚好相反
练习:
运行一下:
当登陆用户是‘root'时,可以添加学生信息,否则请求拒绝,如果登陆用户不存在,提示用户不存在