姓名:樂仁華 學(xué)號(hào):16140220023
轉(zhuǎn)載自:
【嵌牛導(dǎo)讀】:本文主要是介紹python中裝飾器的作用
【嵌牛鼻子】:python , 裝飾器
【嵌牛提問】:python的裝飾器是什么徊哑?有什么用银还?
【嵌牛正文】:
我想許多剛學(xué)python不久的同學(xué)見到@這樣的符號(hào)串前,都會(huì)有些不知所以的感覺氧枣,我剛開始遇到時(shí)也一臉茫然项滑,后面在網(wǎng)上查了一下說@符號(hào)是裝飾器的語法糖费韭,那么問題來了茧球,裝飾器是啥,語法糖是啥玩意兒星持,能吃嗎抢埋。。督暂。揪垄。。
為了搞清楚這個(gè)糖到底是可不可以吃的逻翁,我們來一個(gè)個(gè)搞明白饥努。
以下內(nèi)容參考自知乎的回答
裝飾器
裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能八回,裝飾器的返回值也是一個(gè)函數(shù)對象酷愧。有了裝飾器,我們就可以抽離出大量與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用辽社,概括的講伟墙,裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能。
先來看一個(gè)簡單例子:
def foo():
print('i am foo')
現(xiàn)在有一個(gè)新的需求滴铅,希望可以記錄下函數(shù)的執(zhí)行日志戳葵,于是在代碼中添加日志代碼:
def foo():
print('i am foo')
logging.info("foo is running")
bar()、bar2()也有類似的需求汉匙,怎么做拱烁?再寫一個(gè)logging在bar函數(shù)里?這樣就造成大量雷同的代碼噩翠,為了減少重復(fù)寫代碼戏自,我們可以這樣做,重新定義一個(gè)函數(shù):專門處理日志 伤锚,日志處理完之后再執(zhí)行真正的業(yè)務(wù)代碼
def use_logging(func):
logging.warn("%s is running" % func.__name__)
func()
def bar():
print('i am bar')
use_logging(bar)
邏輯上不難理解擅笔,但是這樣的話,我們每次都要將一個(gè)函數(shù)作為參數(shù)傳遞給use_logging函數(shù)。而且這種方式已經(jīng)破壞了原有的代碼邏輯結(jié)構(gòu)猛们,之前執(zhí)行業(yè)務(wù)邏輯時(shí)念脯,執(zhí)行運(yùn)行bar(),但是現(xiàn)在不得不改成use_logging(bar)弯淘。那么有沒有更好的方式的呢绿店?當(dāng)然有,答案就是裝飾器庐橙。
簡單裝飾器
def use_logging(func):
def wrapper(*args, **kwargs):
logging.warn("%s is running" % func.__name__)
return func(*args, **kwargs)
return wrapper
def bar():
print('i am bar')
bar = use_logging(bar)
bar()
函數(shù)use_logging就是裝飾器假勿,它把執(zhí)行真正業(yè)務(wù)方法的func包裹在函數(shù)里面,看起來像bar被use_logging裝飾了态鳖。
@符號(hào)是裝飾器的語法糖转培,在定義函數(shù)的時(shí)候使用,避免再一次賦值操作(@符號(hào)看來是為了減少操作的工作郁惜。堡距。甲锡。兆蕉。)
def use_logging(func):
def wrapper(*args, **kwargs):
logging.warn("%s is running" % func.__name__)
return func(*args, **kwargs)
return wrapper
@use_logging
def foo():
print("i am foo")
@use_logging
def bar():
print('i am bar')
bar()
這樣我們就可以省去bar = use_logging(bar)這一句了,直接調(diào)用bar()即可得到想要的結(jié)果缤沦。如果我們有其他的類似函數(shù)虎韵,我們可以繼續(xù)調(diào)用裝飾器來修飾函數(shù),而不用重復(fù)修改函數(shù)或者增加新的封裝缸废。這樣包蓝,我們就提高了程序的可重復(fù)利用性,并增加了程序的可讀性企量。
所以裝飾器是個(gè)好東西测萎,要學(xué)會(huì)用起來。還有很多關(guān)于裝飾器詳細(xì)的解釋届巩,可以看看這個(gè)知乎上的回答:https://www.zhihu.com/question/26930016