python中多个装饰器

  • 多个装饰器执行顺序
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_a
@decorator_b
def f(x):
    print('Get in f')
    return x * 2
f(2)
结果为:
Get in decorator_b
Get in decorator_a
Get in inner_a
Get in inner_b
Get in f

多个装饰器练习

import functools
import inspect

def is_admin(fun):
    @functools.wraps(fun)
    def wrapper(*args,**kwargs):
        #inspect.getcallargs返回一个字典,key值是形参,value值
        #是对应的实参{'name':'root'}
        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('not root user!')
    return wrapper

login_session = ['root', 'redhat', 'westos']

def is_login(fun):
    @functools.wraps(fun)
    def wrapper(*args,**kwargs):
        if args[0] in login_session:
            res = fun(*args,**kwargs)
            return res
        else:
            print('Error:%s未登录' %args[0])
    return wrapper



@is_login
@is_admin
def add_student(name):
    print('添加学生信息...')

add_student('redhat')

结果为:
inspect的返回值: {'name': 'redhat'}
not root user!

猜你喜欢

转载自blog.csdn.net/qq_44236589/article/details/88956561