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...