python多个装饰器详解_python——多个装饰器的执行顺序

多个装饰器的执行顺序:

以下我们用一个例子查看多个装饰器的执行顺序

def decorator_a(func):

print('Get in decorator_a')

def inner_a(*args,**kwargs):

print('Get in inner_b')

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

print(f(1))

结果:

Get in decorator_a

Get in decorator_b

Get in inner_b

Get in inner_b

Get in f

2

例题: 定义装饰器log,用户判断用户是否登陆成功 定义装饰器isroot,用于判断用户是不是为root 编写这2个装饰器:先判断是否登陆成功,再判断是不是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':

print('is root')

res = fun(*args,**kwargs)

return res

else:

print('not root user')

return wrapper

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

def log(fun):

@functools.wraps(fun)

def inlog(name):

if name in li:

print('登陆成功')

res = fun(name)

return res

else:

print('登陆失败')

return inlog

@log

@is_root

def add_student(name):   ##此处的name为inspect.getcallargs返回字典中的key值

print('添加学生信息...')

add_student('root')

结果:

登陆成功                ##先判断登陆

inspect_res的返回值为:{'name': 'root'}   ##判断是不是root

is root

添加学生信息...     ##最后执行返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值