python 挖裝飾器祖墳事件

2021-09-07 03:46:54 字數 3907 閱讀 5072

裝飾器是什麼呢?

我們先來打乙個比方,我寫了乙個python的外掛程式,提供給使用者使用,但是在使用的過程中我新增了一些功能,可是又不希望使用者改變呼叫的方式,那麼該怎麼辦呢?

這個時候就用到了裝飾器。裝飾器的原理是什麼?我們接下來就一步一步看過來!

假如我們有乙個home函式如下:

1

defhome():

2print

'this is the home page!

'

而我們希望使用者在訪問home函式之前先驗證一下許可權,那麼在不改變使用者呼叫方法的情況下,就需要在home中呼叫乙個login函式,就像這樣:

1

deflogin(usr):

2if usr == '

eva_j':

3return

true

4def

home():

5 result =login()6if

result:

7print

'this is the home page!

'

這樣可以實現我們的需求,但是我們看到home的**發生了很大的變化,所有的**都要被包裹在乙個if語句中,並且要進行縮排,這往往不是我們希望看到的。那麼我們還可以怎麼做呢?

首先我們看乙個小栗子:

def

home():

print

'this is the home page!

'print home

輸出:

我們定義了乙個home函式,但是並不使用home()呼叫它,而是讓程式列印出home方法的位址。

那麼我們再看這段**:

1

deflogin(usr):

2if usr == '

eva_j':

3return

true

4def

5if login('

eva_j'):

6return

funcname

7def

home():

8print

'this is the home page!'9

11 home()

輸出的結果:this is the home page!

1

deflogin(usr):

2if usr == '

eva_j':

3return

true45

def6

if login('

aaa'):7

return

funcname89

10def

home():

11print 'this is the home page!'

1213 home()

def

home(usr):

print

'this is the home page!

'

我們來看看下面的實現方法:

1

def2

print

'funcname:

',funcname

3def4if

login(argv):

5print

'funcname:

',funcname

6return

funcname(argv)

7else:8

return

error

9return

1011

12def

home(usr):

13print

'this is the home page!'14

print

'hello ,

',usr

1517 home('

eva_j

')輸出的結果:

funcname:

funcname:

this is the home page!

hello , eva_j

解決啦,我們實現了裝飾器的傳參,那麼如果我想傳多個引數,不確定的引數可不可以呢?當然可以啦,你就用動態傳參就好了呀~~~

看到這裡基本上普通青年就夠用了。但是作為乙個文藝小青年,你願不願意用乙個晚上的時間,來刨一刨裝飾器的祖墳?

先來看多個裝飾器的應用。

1

def2

definner():

3print

'w1,before'4

func()

5print

'w1,after'6

return

inner78

def9

definner():

10print

'w2,before'11

func()

12print

'w2,after'13

return

inner

1415

1617

deffoo():

18print

'foo'19

20 foo()

執行結果:

w2,before

w1,before

foow1,after

w2,after

從上面這個例子我們可以看出,裝飾器就像是乙個俄羅斯套娃,把被裝飾的方法當成最小的乙個娃娃,封裝在最內層,外面一層一層的巢狀裝飾器。

接下來再看乙個裝飾器傳遞函式引數的例子:

1

defbefore(request):

2print

'before'3

4def

after(request):

5print

'after'6

7def

filter(before_func,after_func):

8def

outer(main_func):

9def

10 before_result =before_func(request)

11if(before_result !=none):

12return

before_result;

13 main_result =main_func(request)

14if(main_result !=none):

15return

main_result;

16 after_result =after_func(request)

17if(after_result !=none):

18return

after_result;

19return

20return

outer

2122

@filter(before, after)

23def

index(request):

24print

'index'25

26 index('

example

')先上結果:

before

index

after

首先,index裡我只是隨便傳了乙個引數,並沒有什麼實際的意義,不要被迷惑了。接下來看看這段**的執行過程:

看上面這張圖,先來統一解釋一下,**前面的數字是python在執行index之前做的事情,它將這段**中函式的位址寫入記憶體,方便之後在呼叫中可以一下子找到。

ok,刨祖墳活動結束,關機,睡覺!

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...

python裝飾器原理 Python裝飾器原理

裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...