裝飾器是什麼呢?
我們先來打乙個比方,我寫了乙個python的外掛程式,提供給使用者使用,但是在使用的過程中我新增了一些功能,可是又不希望使用者改變呼叫的方式,那麼該怎麼辦呢?
這個時候就用到了裝飾器。裝飾器的原理是什麼?我們接下來就一步一步看過來!
假如我們有乙個home函式如下:
1而我們希望使用者在訪問home函式之前先驗證一下許可權,那麼在不改變使用者呼叫方法的情況下,就需要在home中呼叫乙個login函式,就像這樣:defhome():
2print
'this is the home page!
'
1這樣可以實現我們的需求,但是我們看到home的**發生了很大的變化,所有的**都要被包裹在乙個if語句中,並且要進行縮排,這往往不是我們希望看到的。那麼我們還可以怎麼做呢?deflogin(usr):
2if usr == '
eva_j':
3return
true
4def
home():
5 result =login()6if
result:
7print
'this is the home page!
'
首先我們看乙個小栗子:
def我們定義了乙個home函式,但是並不使用home()呼叫它,而是讓程式列印出home方法的位址。home():
'this is the home page!
'print home
輸出:
那麼我們再看這段**:
1deflogin(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!
1deflogin(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):
'this is the home page!
'
1解決啦,我們實現了裝飾器的傳參,那麼如果我想傳多個引數,不確定的引數可不可以呢?當然可以啦,你就用動態傳參就好了呀~~~def2
'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
'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首先,index裡我只是隨便傳了乙個引數,並沒有什麼實際的意義,不要被迷惑了。接下來看看這段**的執行過程: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
看上面這張圖,先來統一解釋一下,**前面的數字是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 要理解上述 的含義,我們從自定義函式裝...