Lesson 92 Python中多个装饰器的应用示例
1. 示例1:多个装饰器调用顺序
通过下面这个例子来研究多个装饰器的调用顺序
def decorator_a(fun):
def inner_a(*args,**kwargs):
print('This is inner_a')
return fun(*args,**kwargs)
return inner_a
def decorator_b(fun):
def inner_b(*args,**kwargs):
print('This is inner_b')
return fun(*args,**kwargs)
return inner_b
@decorator_b
@decorator_a
def f(x):
print('This is f')
return x*2
f(1)
可以看到,先调用哪个装饰器,哪个装饰器就先运行
2. 多个装饰器的应用示例:判断用户是不是root用户,root用户可以添加和删除
判断是否为管理员root登陆,如果为root登陆,则显示相应的信息
inspect.getcallargs返回一个字典, key值:形参 value值:对应的实参
import functools
import inspect
def is_admin(fun): #定义装饰器1,其功能是判断用户是不是管理员root用户登陆,只有超级用户才可以进新用户管理
@functools.wraps(fun)
def wrapper(*args,**kwargs):
#inspect.getcallargs返回一个字典,key值:形参 value值:对应的实参
inspect_res = inspect.getcallargs(fun,*args,*kwargs)
print('inspect的返回值: %s' %inspect_res)
if inspect_res.get('name') == 'root':
res = fun(*args,**kwargs)
return res
else:
print('Permission denied!')
return wrapper
login_user = ['root','admin','redhat']
def is_login(fun): #定义装饰器2,判断登陆的用户是否是系统存在的可以登陆系统的用户
@functools.wraps(fun)
def wrapper(*args,**kwargs):
if args[0] in login_user:
res = fun(*args,**kwargs)
return res
else:
print('Error: %s未登录' %args[0])
return wrapper
@is_login #先调用装饰器2
@is_admin #再调用装饰器1
def add_student(name):
print('添加学生%s...' %name)
add_student('root')
可以看到inspect返回一个字典,root用户可以成功登陆系统
如果是系统存在的可以登陆系统的用户而不是超级用户,则显示Permission denied
如果是系统中不存在的用户,则无法登录系统