python无参数装饰器_python_之无参装饰器_01
# 1:提問(wèn):什么是裝飾器?
# 解答:根據(jù)字面意思可以理解,裝飾器就是用來(lái)裝飾函數(shù)的工具。
#
# 2:裝飾器有什么特點(diǎn)?
# 解答:(1) 裝飾器原則:開放封閉原則。 解釋==》開放是指,對(duì)外開放,封閉是指:不修改原代碼。
# (2) 特點(diǎn)1:給被裝飾函數(shù)添加新功能
# (3) 特點(diǎn)2: 調(diào)用被裝飾函數(shù)
#
# 3:小案例: 給index()函數(shù)加上計(jì)時(shí)器
# import time
# def index(name):
# print(f"歡迎{name}來(lái)到這里")
# return "我是index的返回值"
#
# def home(name):
# print(f"歡迎{name}回家了")
# (1) 不改變?cè)创a,不改變調(diào)用方式
# start_time = time.time()
# index("madison")
# sto_time = time.time()
# 問(wèn)題1==》如果項(xiàng)目中有很多地方調(diào)用的話,會(huì)出現(xiàn)代碼冗余的問(wèn)題。==》優(yōu)化方案如下:封裝它
# 這樣一來(lái),我們就解決了代碼冗余問(wèn)題:
# def wrapper():
# start_time = time.time()
# index("madison")
# stop_time = time.time()
# 問(wèn)題2:雖說(shuō)解決了代碼冗余問(wèn)題,但是我們這里index()的參數(shù)寫死了,
# 并且這個(gè)裝飾器里面的調(diào)用的函數(shù)寫死了
# 只能調(diào)用index(),如果還有一個(gè)功能home()怎么辦?
# 優(yōu)化方案如下 ==》
# (1):解決傳參問(wèn)題 ==》 利用(*args, **keargs) 進(jìn)行傳參和解包
# (2):解決index()函數(shù)寫死問(wèn)題,利用閉包傳參
# import time
# def outter(func):
# def wrapper(*args, **kwargs):
# start_time = time.time()
# func(*args, **kwargs) # 對(duì)傳進(jìn)來(lái)的參數(shù)進(jìn)行解包!
# stop_time = time.time()
# return wrapper # 返回wrapper的內(nèi)存地址
#
# wrapper = outter(index)
# wrapper("madison")
# print("====================")
# wrapper = outter(home) # 在試試調(diào)用home上面忘記試了,看好不好使
# wrapper("madison")
# 這里我解釋下:return wrapper是因?yàn)?#xff0c;wrapper之前是全局變量,現(xiàn)在被我們寫成局部變量了,
# 所以在這里
# 我們需要把它變回去,所以我們就返回它的內(nèi)存地址,
# 上面我們調(diào)用outter(index)就是得到的wrapper的內(nèi)存
# 地址,這里賦值給wrapper所以此時(shí) wrapper又變回成了全局變量然后傳參調(diào)用wrapper即可!
# 問(wèn)題3:上面我們已經(jīng)解決了寫死函數(shù)和傳參問(wèn)題,那么還有個(gè)問(wèn)題就是返回值的問(wèn)題?
# 假如index有返回值,怎么辦?
# import time
# def outter(func):
# def wrapper(*args, **kwargs):
# start_time = time.time()
# res = func(*args, **kwargs) # 對(duì)傳進(jìn)來(lái)的參數(shù)進(jìn)行解包!
# stop_time = time.time()
# return res
# return wrapper # 返回wrapper的內(nèi)存地址
#
# wrapper = outter(index)
# print(wrapper("madison"))
# 優(yōu)化方式:看上面,我們知道index的返回值這個(gè)裝飾器內(nèi)部,它是func=index,所以index返回啥,我們func就返回
# 啥就可以了,所以就有了上面的 return res,對(duì)了你可以試試在wrapper內(nèi)部不接收打印,結(jié)果會(huì)是None,原因是因?yàn)?/p>
# 我們現(xiàn)在調(diào)用的其實(shí)是wrapper,而不是index,有的小伙伴可能會(huì)蒙蔽,我上面明明就是調(diào)用的wrapper....這個(gè)問(wèn)題
# 你要回去了解下閉包原理了(這里第二種傳參是閉包原理,不理解最好看一邊后在看上面的列子)。其實(shí)這里我們可以把
# wrapper = outter(index)改成 index = outter(index),你看,這樣我們是不是就 沒(méi)有修改源碼和調(diào)用方式
# 問(wèn)題4:上面我們已經(jīng)做到,不修改源碼和調(diào)用方式,就做了一個(gè)裝飾功能,但是還有問(wèn)題,我們每次調(diào)用的時(shí)候都要去定義
# wrapper = outter(index)/# wrapper = outter(home),我們需要優(yōu)化下,方法是:@(語(yǔ)法糖的意思,甜甜
# 的嘿嘿。)
import time
def outter(func):
def wrapper(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs) # 對(duì)傳進(jìn)來(lái)的參數(shù)進(jìn)行解包!
stop_time = time.time()
return res
return wrapper # 返回wrapper的內(nèi)存地址
# index = outter(index)
# print(index("madison"))
# 問(wèn)題4的優(yōu)化方案:在我們需要調(diào)用裝飾器的頭上寫上 @outter 即可
@outter
def index(name):
print(f"歡迎{name}來(lái)到這里")
return "我是index的返回值"
@outter # 它在這做了下面幾件事
# 1:調(diào)用outter ==> outter()
# 2: 將被裝飾(index)傳進(jìn)去 ==》 outter(index)
# 3: 賦值給變量,變量名被裝飾自己 ==》 index = outter(index)
def home(name):
print(f"歡迎{name}回家了")
最后附上本節(jié)的完整代碼的圖片
總結(jié)
以上是生活随笔為你收集整理的python无参数装饰器_python_之无参装饰器_01的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 山莴苣的功效与作用、禁忌和食用方法
- 下一篇: led灯条维修_led硅胶线条灯不亮的8