重點面試知識 多個裝飾器疊加的原理

2021-08-28 13:16:07 字數 1730 閱讀 9496

當乙個被裝飾的物件同時疊加多個裝飾器時

我們來看下面這段**

我們定義了兩個裝飾器:無參裝飾器timmer與有參裝飾器auth

我們用這兩個裝飾器去修飾index函式。讓我們看看到底是發生了一件什麼事

import time

def timmer(func):

start = time.time()

res = func(*args, **kwargs)

stop = time.time()

print('run time is %s' % (stop - start))

return res

def auth(engine='file'):

def ***(func):

name = input('username>>>: ').strip()

pwd = input('password>>>: ').strip()

if engine == 'file':

print('基於檔案的認證')

if name == 'egon' and pwd == '123':

print('login successfull')

res = func(*args, **kwargs)

return res

elif engine == 'mysql':

print('基於mysql的認證')

elif engine == 'ldap':

print('基於ldap的認證')

else:

print('錯誤的認證源')

return ***

@timmer

@auth(engine='file')

def index():

print('welcome to index page')

time.sleep(2)

index()

文章一開頭,我們就已經說了,裝飾器的載入順序是由下而上的。就是說離被裝飾函式最近的裝飾器先載入。

那麼在這段**中可以看到,是@auth(engine='file')先被載入,在載入的時候,python一遇到函式名+()就會觸發函式的執行,也就是說,載入的第一步就是執行了auth(engine='file')函式。

我們拐過頭來去看auth函式的**,執行auth函式其實就幹了兩件事,定義乙個叫***的函式,然後將***函式記憶體位址作為返回值返回。沒有呼叫***就不會觸發***函式的執行。

在這裡就是幹了這樣一件事:index=***(index)(這裡需要注意。第一:為什麼是***呢?因為在auth函式執行完畢後把***函式的記憶體位址作為返回值返回了。所以這裡是***。第二:括號內的index和等號左邊的index不是同乙個東西,括號內的index是原函式index的記憶體位址,等號左邊的index就是乙個變數名。)然後其實現在**就是變成了下述**的樣子,只是這是在後台自動做的,我們看不到。這些都是python直譯器默默地幫我們實現的。

@timmer

def index():

print('welcome to index page')

time.sleep(2)

def index():

print('welcome to index page')

time.sleep(2)

以上就是裝飾器載入時python直譯器在背後默默幫我們做的事。

這就是我們上面所說的:

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

Python 疊加多個裝飾器的載入順序及執行順序

def deco1 func1 def args,kwargs print res1 func1 args,kwargs print return res1 defdeco2 func2 def args,kwargs print res2 func2 args,kwargs print retur...

Python多個裝飾器的順序

更新 多個裝飾器的呼叫順序是自下往上,但是執行時的執行順序是自上往下!裝飾器是python用於封裝函式或 的工具,網上可以搜到很多文章可以學習,我在這裡要討論的是多個裝飾器執行順序的乙個迷思。大部分涉及多個裝飾器裝飾的函式呼叫順序時都會說明它們是自上而下的,比如下面這個例子 def decorato...