Python的裝飾器

2021-09-25 18:45:07 字數 2881 閱讀 3833

python的裝飾器decorator本質上是乙個高階函式,它接收乙個函式作為引數,然後返回乙個新的函式,可以讓該函式在不改動源**的情況下增加其他新功能。

python通過乙個語法糖@符號來使用decorator,這樣可以避免編寫f = decorate(f)這樣形式的**。所謂的語法糖便是你不使用也可以完成任務,但是使用它可以讓你的**更簡潔。

對於裝飾器,需要記住的就是

@decorate

deff()

:pass

其中,

@decorate   等價於  f = decorate(f)
示例:

import time

defperformance

(f):

deffn

(*args,

**kw)

: t1 = time.time(

)#unix時間戳

r = f(

*args,

**kw)

t2 = time.time(

)print

'call %s() in %f s'

%(f.__name__, t2 - t1)

return r

return fn

@performance

deffactorial

(n):

return

reduce

(lambda x,y: x*y,

range(1

, n+1)

)print factorial(

10)

執行結果:

call factorial() in 0.002750 s

3628800

@performance可以列印出factorial()函式呼叫的時間。

利用python的*args**kw,可以讓@performance自適應任何引數定義的函式,保證任意個數的引數總是能正常呼叫。

@performance完全等價於factorial = performance(factorial)

對於performance()函式,形成乙個閉包。程式首先呼叫performance(factorial),得到的返回結果賦值給了factorial,這樣factorial就變成了指向函式fn()的指標,經過裝飾後的factorial(),其實是呼叫fn()

示例:

import time

defperformance

(unit)

:def

perf_decorator

(f):

def(

*args,

**kw)

: t1 = time.time(

) r = f(

*args,

**kw)

t2 = time.time(

) t =

(t2 - t1)

*1000

if unit ==

'ms'

else

(t2 - t1)

print

'call %s() in %f %s'

%(f.__name__, t, unit)

return r

return perf_decorator

@performance(

'ms'

)def

factorial

(n):

return

reduce

(lambda x,y: x*y,

range(1

, n+1)

)print factorial(

10)

執行結果:

call factorial() in 2.448082 ms

3628800

@performance('ms')完全等價於factorial = performance('ms')(factorial)

factorial = performance('ms')(factorial)展開一下就是:

perf_decorator = performance('ms')

factorial = perf_decorator(factorial)

perf_decorator = performance(

'ms'

)@perf_decorator

deffactorial()

:pass

所以,帶引數的performance()函式首先返回乙個decorator函式,再讓這個decorator函式接收factorial並返回新函式。

此外,python還有內建函式property(),用作裝飾器時可以很方便的建立唯讀屬性。

python內建函式:

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 要理解上述 的含義,我們從自定義函式裝...