Python之裝飾器 從稀里糊塗到完全搞定

2021-10-04 20:14:57 字數 3138 閱讀 4700

開始前的閒談:

最近python越發火熱,不管是炒作還是真火,相信每個火爆的事物,背後總有乙個不可替代的原因。總的來看,python之所以火是因為其語法簡單,靈活,非常適合初學者,讓「從入門到放棄」的時間有所拉長。有人說python並不能讓你獨當一面,或者說只掌握python不能成為乙個「能走得更遠」的程式設計師。我認為與其擔心、觀望、往復糾結,不如踏踏實實先掌握它。老實想想,自己真的「掌握了python嗎?」,我相信真正掌握後,對於繼續學習和使用其它語言也是不無幫助的。

言歸正傳:先來看乙個例子,判斷乙個數字是否能被3整除:

def

is_div_three

(num)

:return num %3==

0print

(is_div_three(6)

)

執行結果顯然是true

接下來,例如我們需要列印1-10000裡能被3整除的數,很簡單:

def

nums_is_div_tree()

:for i in

range(1

,10000):

if is_div_three(i)

:print

(i)nums_is_div_tree(

)

輸出結果是一連串能被3整除的數字。試想我們又有乙個需求,想知道這個程式執行的效率,即求執行時間,顯然我們可以把上面的函式進行改造:

import time #引入time模組

deftime_is_div_tree()

: t1 = time.time(

)#在執行迴圈前先記錄系統時間

for i in

range(1

,10000):

if is_div_three(i)

:print

(i) t2 = time.time(

)#在執行迴圈後再次記錄時間

return t2-t1 #兩個時間相減獲得執行時間

t = time_is_div_tree(

)print

(t)

def

print_time

(func)

:#裝飾器本身是乙個函式,引數func是需要執行的函式

def():

t1 = time.time(

) func(

) t2 = time.time(

)print

('running time: {} s'

.format

(t2-t1)

)

然後,在上面的nums_is_div_tree()函式上加一行:@print_time:

@print_time

defnums_is_div_tree()

:for i in

range(1

,10000):

if is_div_three(i)

:print

(i)nums_is_div_tree(

)

@print_time

defnums_is_div_tree

(maxnum)

:#使用傳入maxnum

for i in

range(1

, maxnum)

:if is_div_three(i)

:print

(i)nums_is_div_tree(

10000

)

def

print_time

(func)

:#裝飾器本身是乙個函式,引數func是需要執行的函式

def(arg)

: t1 = time.time(

) func(arg)

#將arg傳入需要執行的函式

t2 = time.time(

)print

('running time: {} s'

.format

(t2-t1)

)

執行一切正常~

又有人提出需求,如果裝飾器本身也帶有引數呢?比如,求執行時間時,我們需要列印出一段文字:「裝飾器print_time正在執行中」

我們再去修改裝飾器:

def

print_time

(text)

:#這裡傳入引數

defdecorator

(func)

:#巢狀decorator函式來接收需要執行的函式func

def(arg)

: t1 = time.time(

) func(arg)

#將arg傳入需要執行的函式

t2 = time.time(

)print

(text)

print

('running time: {} s'

.format

(t2-t1)

) return decorator

繼續執行:

@print_time(

'裝飾器print_time正在執行中'

)#傳入我們需要列印的內容

defnums_is_div_tree

(maxnum)

:for i in

range(1

, maxnum)

:if is_div_three(i)

:print

(i)nums_is_div_tree(

10000

)

執行結果,拿到了我們想要的結果:

至此,python裝飾器討論結束,有沒有感覺豁然開朗呢。

python裝飾器介紹 Python之裝飾器簡介

python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...

python 找到裝飾器 Python之裝飾器

裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...

Python之裝飾器

裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...