1.执行顺序
当一个程序里面有多个装饰器的时候如何执行的呢,借助一个程序来理解一下
def decorator_a(func): print('Get in decorator_a') def inner_a(*args,**kwargs): print('Get in inner_a') res = func(*args,**kwargs) return res return inner_a def decorator_b(func): print('Get in decorator_b') def inner_b(*args,**kwargs): print('Get in inner_b') res = func(*args,**kwargs) return res return inner_b @decorator_b @decorator_a def f(x): print('Get in f') return x * 2 f(1)
这段程序的运行结果是
在这个函数还未执行的时候,解释器会从上到下的读取函数,读到@decorator_b @decorator_a在这个时候,会从上到下的执行decorator_b和decorator_a函数,这个顺序是按照代码从上到下的顺序执行的,执行结果为下
然后在进一步执行@decorator_b @decorator_a装饰器内部函数,这时候的执行顺序是按照装饰器被调用的顺序,也就是先执行@decorator_b然后执行@decorator_a,所以结果为
2.练习
写一段代码,只有['root','admin','redhat']用户可以登陆,root用户可以添加学生信息~
import functools import inspect def is_root(fun): @functools.wraps(fun) def wrapper(*args,**kwargs): #inspect.getcallargs返回值是字典,key值为:形参,value值为:形参对应实参 inspect_res = inspect.getcallargs(fun,*args,**kwargs) print('inspect_res的返回值为:%s' %inspect_res) if inspect_res.get('name') == 'root': res = fun(*args,**kwargs) return res else: print('not root user') return wrapper login_list = ['root','admin','redhat'] def is_login(fun): @functools.wraps(fun) def wrapper(*args,**kwargs): if args[0] in login_list: res = fun(*args,**kwargs) return res else: print('Error:%s未登录' %args[0]) return wrapper @is_login @is_root def add_student(name): print('添加学生信息...') add_student('root')
原文:https://blog.csdn.net/weixin_40543283/article/details/87520088