python中多个装饰器的执行顺序

易管家 提交于 2019-12-03 13:42:58

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!