轉(zhuǎn)載請注明出處:http://www.reibang.com/u/0d277af5103c
要了解python中@裝飾器的作用株憾,首先要記住這么幾點:
1 . 裝飾器符號“@”屬于語法糖锣光,什么意思呢淘这?就是說总处,我不按照@裝飾器的語法要求來寫漓帅,而是按照一般python的語法要求來寫完全可以蚪缀。那么用@裝飾器的格式來寫的目的就是為了書寫簡單方便
2. 裝飾器的作用是什么呢? 簡單的理解就是:裝飾原有的函數(shù)贺辰。什么意思呢户盯?比如有一個函數(shù)func(a, b),它的功能是求a,b的差值饲化,我現(xiàn)在有一個需求莽鸭,就是想對函數(shù)功能再裝飾下,求完差值后再取絕對值吃靠,但是不能在func函數(shù)內(nèi)部實現(xiàn)硫眨,這時候就需要裝飾器函數(shù)了,比如func = decorate(func)函數(shù)巢块,將func函數(shù)作為參數(shù)傳遞給decorate函數(shù)礁阁,由decorate來豐富func函數(shù)巧号,豐富完成后再返回給func,此時func的功能就豐富了。
3.python的常識姥闭,函數(shù)和其他任何東西一樣丹鸿,都是對象。這意味著可以將函數(shù)當做實參傳遞給函數(shù)棚品,或者在函數(shù)中將函數(shù)作為返回值返回靠欢。例碼驗證:
def add(x, y):
... return x + y
def sub(x, y):
... return x - y
def apply(func, x, y): # 1
... return func(x, y) # 2
apply(add, 2, 1) # 3
3
apply(sub, 2, 1)
1
了解上述觀點后,可以先不用@符號來寫一個簡單的裝飾器
def decorate(func):
def decorate(func):
def inner(a, b):
ret = func(a, b):
return abs(ret)
return inner
def sub(a, b):
return a-b
sub(3, 4)
... -1
sub = decorate(sub)
sub(3, 4)
1
對于sub = decorate(sub)的理解铜跑。 最終會將inner的值傳給sub 门怪,此時執(zhí)行sub(3, 4),其實是執(zhí)行decorate中的inner锅纺,所以為1.
那么為了書寫方便掷空,將sub=decorate(sub)換為@decorate,并放在sub的定義面前囤锉,即:
@decorate
def sub(a, b):
return a-b
只是書寫不同坦弟,結(jié)果相同。