python是很具特色的一門語言。除了面向協議程式設計的方式,還有許多語法糖,今天要介紹的語法糖————裝飾器
我們不妨以舉例的方式來一步一步的深入了解裝飾器
假如我們在執行函式f1,f2的時候,列印執行函式時候的時間。
我們很可能會這樣做:
# 第一種
import time
deff1()
:print
(time.time())
print
("this is f1"
)deff2(
):print
(time.time())
print
("this is f2"
)
f1()
f2()
這樣看似是沒有問題的,我們也樂意這樣做,因為也很簡單,引入time
模組再來乙個print語句就ok了,但是如果一百個,一千個函式呢,我們還這樣寫嗎?答案是否定的。程式設計師是乙個"偷懶"的行業。能不寫大量的重複**絕對不寫。那我們會想到專門寫乙個函式列印時間。在每個函式裡呼叫不就可以了麼。是的這樣可以。**如下
# 第二種
import time
deff1()
: print_time(
)print
("this is f1"
)deff2(
):print_time(
)print
("this is f2"
)def
print_time()
:print
(time.time())
f1()
f2()
但是這樣相比第一種雖然簡單了,但是這樣同樣的增加了耦合性。每個函式都需要去修改一下,我們能不能再不修改原來函式的情況下就可以增加這個列印時間的功能呢?既然我們不修改函式,那我們修改函式的呼叫方式嗎?
# 第三種
import time
deff1()
:print
("this is f1"
)deff2(
):print
("this is f2"
)def
print_time
(f):
print
(time.time())
f()
print_time(f1)
print_time(f2)
第三種就好很多了,第一:沒有改變原來的函式,降低了耦合。呼叫方法也簡單了。只需要把函式名傳到另乙個函式裡就可以了。裝飾器就是採用這種,但是用起來更加方便。**寫起來也更加高大上。這樣我們逐漸引出今天的主題——裝飾器
裝飾器的寫法很固定,有點像閉包(雖然沒有引入環境變數)。使用裝飾器也很簡單只需要在需要列印時間的函式上加入@裝飾器名
。呼叫這個函式就能夠執行對應裝飾器的功能。其裝飾器的基本框架如下
def
decorator
(f):
def():
pass
f()
那麼我們對第三種**進行裝飾器的修改
def
decorator
(f):
def():
print
(time.time())
func(f)
# @裝飾器名
@decorator
deff1()
:print
("this is name f1"
)@decorator
deff2()
:print
("this is name f2"
)#呼叫方法和普通函式執行方法一樣
f1()
f2()
這樣看起來依然很美好,用了完美的語法糖。也沒有增加**的耦合性。但是有個問題,這只是乙個簡單的裝飾器,萬一我們需要傳入引數呢。萬一有些函式需要傳入1個引數,而另外乙個函式需要傳入很多引數,那我們又該怎麼辦,python中當然有可變引數的傳入方式*args
,**kwargs
。那麼我們按照這個思路來修改我們的裝飾器
import time
defdecorator
(f):
def(
*args,
**kwargs)
:#print(time.time())
#這裡寫裝飾器需要實現的功能
f(*args,
**kwargs)
@decorator
deff1
(fun_name)
:print
("this is name "
+fun_name)
@decorator
deff2
(fun_name1,fun_name2)
:print
("this is name "
+fun_name1+
" "+fun_name2)
f1('f1'
)f2(
'f2'
,'f3'
)
這樣我們就實現了多引數的裝飾器,任何需要列印時間的函式頭上都可以頂乙個這樣。方便了你我他。同時也體現了python的優雅。
人生苦短,我用python
多多關注:
本人的個人部落格**
本人的漫畫**
python裝飾器理解 python裝飾器理解
裝飾器 在不改變原函式的 和呼叫方法的基礎上,給原函式增加額外的功能 理解宣告 為了方便理解,以下例子採用最簡潔的函式和新增的功能 給原函式新增乙個執行時間 import time def timer func def inner func return inner timer func timer...
python裝飾器 理解Python裝飾器
在python中,對於乙個函式,若想在其執行前後做點什麼,那麼裝飾器是再好不過的選擇,話不多說,上 usr bin env coding utf 8 script 01.py author howie from functools import wraps def decorator func wr...
python裝飾器理解 python裝飾器的理解
python裝飾器應該算是面試常考到的用點,之前在flask的應用中也是會常常用到,抽空仔細看書查資料理解了下裝飾器的概念,通過自己的理解記憶,應該對這個概念會有乙個大致上具體的了解。閉包說起python裝飾器,我們應該不得不談談閉包的概念。我對閉包的理解是,當函式存在巢狀,子函式呼叫了父函式的變數...