92. Python中多个装饰器的应用示例

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
在这里插入图片描述
如果是系统中不存在的用户,则无法登录系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值