python中多個裝飾器的執行順序

2021-09-11 01:25:52 字數 1873 閱讀 3317

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)

#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')

login_list = ['root','admin','redhat']

def is_login(fun):

@functools.wraps(fun)

if args[0] in login_list:

res = fun(*args,**kwargs)

return res

else:

print('error:%s未登入' %args[0])

@is_login

@is_root

def add_student(name):

print('新增學生資訊...')

add_student('root')

ok~

python 中多個裝飾器的執行順序

python 中多個裝飾器的執行順序 def inner1 args,kwargs print in inner1 ret f1 args,kwargs print 111 return ret return inner1 def inner2 args,kwargs print in inner2...

python中多個裝飾器的執行順序詳解

裝飾器是程式開發中經常會用到的乙個功能,也是python語言開發的基礎知識,如果能夠在程式中合理的使用裝飾器,不僅可以提高開發效率,而且可以讓寫的 看上去顯的高大上 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 今天講一下python中裝飾器的執行順序,以兩個裝飾器為例。裝飾器 如下 ...

Python 多個裝飾器的執行順序

一.多個裝飾器的的執行順序 接下來我們以例子來檢視執行順序 def decorator a func print get in decorator a def inner a args,kwargs print get in inner a res func args,kwargs return r...