日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python无参数装饰器_python_之无参装饰器_01

發布時間:2024/9/19 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。