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