在這裡,我們先不用理解實現裝飾器需要的幾個python特性,以及裝飾器的內在原理。
我們僅僅先了解函式裝飾器的基本作用,以及怎麼實現乙個具備基本作用的函式裝飾器。
函式裝飾器的基本作用:
字面理解,裝飾函式用的。其作用也不是很高大上,不過是裝飾器,可以對其裝飾的函式物件,做一些這個函式執行前的準備工作,以及執行後的請理工作。
工作流程類似於:
setup(
)fun(
)teardown(
)
而裝飾器不過是改變了其表現形式而已,變成了這樣:
@do_it
deffun()
:pass
所以,可以理解的是,不使用裝飾器,我們依然可以完成目標任務。只是使用裝飾器可以是的**結構更優雅。
實現乙個具備基本作用的函式裝飾器:
from functools import wraps
defdo_it
(func)
: @wraps(func)
def(
*args,
**kwargs)
:print
('setup'
) func(
*args,
**kwargs)
print
('teardown'
)@do_it
defmy_func()
:print
("這裡是被呼叫的函式"
)if __name__ ==
"__main__"
: my_func(
)
其輸出應該是:
setup
這裡是被呼叫的函式
teardown
[finished in
1.0s]
再看看被呼叫函式不被裝飾的情況:
from functools import wraps
defdo_it
(func)
: @wraps(func)
def(
*args,
**kwargs)
:print
('setup'
) func(
*args,
**kwargs)
print
('teardown'
)# @do_it
defmy_func()
:print
("這裡是被呼叫的函式"
)if __name__ ==
"__main__"
: my_func(
)
現在的輸出是:
這裡是被呼叫的函式
[finished in
0.9s]
一些tips:
from functools improt wraps 、 @wraps(func)這兩句是必要的,因為這樣可以幫助保留被裝飾函式物件的元資料。(元資料是指函式物件本身的一些資訊,包含函式名等等)保留元資料在某些時候是必要的。
關於函式裝飾器返回值的tips:
from functools import wraps
defdo_it
(func)
: @wraps(func)
def(
*args,
**kwargs)
:print
('setup'
) res = func(
*args,
**kwargs)
print
('my_func的返回值 = {}'
.format
(res)
)print
('teardown'
)return
2@do_it
defmy_func()
:print
("這裡是被呼叫的函式"
)return
1if __name__ ==
"__main__"
: rrres = my_func(
)print
("被裝飾的函式執行後的返回值是:{}"
.format
(rrres)
)
仔細看其輸出:
setup
這裡是被呼叫的函式
my_func的返回值 =
1teardown
被裝飾的函式執行後的返回值是:2
[finished in
0.9s]
上述過程說明了一件事,理解了這件事,也就理解了裝飾器的資料流過程:
@do_it
def my_func():
上述語法,當my_func()被呼叫時,可以理解為我們不是呼叫的my_func(),而是呼叫的do_it(my_func),my_func函式物件作為乙個輸入引數,傳遞給do_it(),所以最終的返回值,是do_it被呼叫的返回值。一句話總結:這次呼叫的輸入引數是my_func函式物件,返回值是do_it執行完成的返回值。
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 裝飾器 wraps作用 使用記錄
def is login func def foo args,kwargs return func args,kwargs return foo deftest print 我是 test.name is login deftest1 print 我是 test1.name is login def...