欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Python無參裝飾器的實現方案及優化

Python無參裝飾器的實現方案及優化

熱門標簽:外呼并發線路 地圖標注審核表 湛江智能外呼系統廠家 長沙高頻外呼系統原理是什么 百度地圖標注沒有了 宿遷星美防封電銷卡 西藏房產智能外呼系統要多少錢 ai電話機器人哪里好 ai電銷機器人源碼

一、什么是裝飾器

定義一個函數,該函數可為其他函數添加額外的功能。

二、何時用裝飾器

需要在不修改被裝飾對象源代碼及其調用方式時,為被裝飾對象添加額外的功能。

三、如何寫一個裝飾器

現在我們有如下一個函數help(),time.sleep()來模擬函數執行時間,print打印傳入參數值,方便我們來進行分析。如果現在我們需要為help函數添加一個統計其運行時間的功能,我們可以怎么做?

import time
 
def help(x, y):
    time.sleep(1)
    print(f'x={x} y={y}')
 
help(1, 2)

方案一:

在help函數開頭結束分別調用time.time(),兩者相減得運行時間。

import time
 
def help(x, y):
    start = time.time()
    time.sleep(1)
    print(f'x={x} y={y}')
    stop = time.time()
    print(stop - start)
 
help(1, 2)

運行結果:

方案一中我們在help中加了相關代碼,雖然沒有改變它的調用方式,但改變了它的源代碼。我們繼續想想如何兩者都不改變的情況下,完成我們的目標。

對,函數內不能動,我們可以動函數外呀,在help前后加上相關代碼,似乎就可以達到我們的目標了,這就是方案二,我們來試試。

方案二:

import time
 
def help(x, y):
    time.sleep(1)
    print(f'x={x} y={y}')
 
start = time.time()
help(1, 2)
stop = time.time()
print(stop - start)

運行結果:

顯而易見,似乎沒有問題,但是如果我們需要多次調用help函數的話,在它前后都得加上相同的代碼,這樣代碼就會顯得十分冗余了。既然help函數前后代碼不會變的話,我們可以將它們封裝成另一個函數呀,說干就干。

方案三:

import time
 
def help(x, y):
    time.sleep(1)
    print(f'x={x} y={y}')
 
def wrapper():
    start = time.time()
    help(1, 2)
    stop = time.time()
    print(stop - start)
 
wrapper()

運行一下:

 

這樣我們就解決了多次調用的問題,但美中不足的是,help函數的調用方式改變了,而且help的參數固定,也只能修飾help函數,我們來一步步試著優化。

優化一(參數優化,實現任意參數): 

對參數優化,我們可以將help的實參通過wrapper的傳入,而為了實現任意參數,我們首先想的便是*args,**kwargs來作為函數的參數,于是將方案三進行改進如下(為方便分析,為help多增加了一個參數):

import time
 
 
def help(x, y, z):
    time.sleep(1)
    print(f'x={x} y={y} z={z}')
 
 
def wrapper(*args, **kwargs):
    start = time.time()
    help(*args, **kwargs)
    stop = time.time()
    print(stop - start)
 
 
wrapper(1, 2, 3)

運行一下:

這樣我們便將help的參數變得更加靈活了,接著我們來優化。

優化二(實現裝飾其他對象):

需要裝飾其他對象,意味著我們在help位置的應該是一個可變參數,也就是用戶輸入的參數,即wapper函數內應變為:

def wrapper(*args, **kwargs):
    start = time.time()
    func(*args, **kwargs)
    stop = time.time()
    print(stop - start)

但是我們期望wrapper能和內部調用的func函數的參數一致,即wrapper的參數我們應該不去改變,那我們func的值從何處傳來呢?

沒錯,我們可以運用閉包函數來傳參,修改一下下:

def outter(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        stop = time.time()
        print(stop - start)
 
    return wrapper

這樣我們為其他函數修飾時,只需要將其函數名作為outter函數的參數傳入即可:

import time
 
def help(x, y, z):
    time.sleep(1)
    print(f'這是help的{x}{y}{z}')
 
def others(x, y, z):
    time.sleep(1)
    print(f'這是others的{x}{y}{z}')
 
def outter(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        stop = time.time()
        print(stop - start)
 
    return wrapper
 
help = outter(help)
others = outter(others)
 
help(1, 2, 3)
others(4, 5, 6)

運行一下:

結果符合預期,而且在使用時由于outter內的func是在局部名稱空間,outter外的func是在全局名稱空間,調用時二者并不沖突,并且使用時可讀性較高,我們好像達成開始的目標,似乎能以假亂真了。但我們繼續思考一下,我們演示用到的函數十分簡單,甚至沒有返回值,如果加上返回值后,我們再對其修飾后,能得到原函數的返回值嗎?

優化三(得到相同返回值):

回到我們的wrapper中去,既然需要我們func函數的返回值,我們直接將其賦值給res,再return出res的值:

import time
 
def help(x, y, z):
    time.sleep(1)
    print(f'這是help的{x}{y}{z}')
    return 'help'
 
def others(x, y, z):
    time.sleep(1)
    print(f'這是others的{x}{y}{z}')
    return 'others'
 
def outter(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        res=func(*args, **kwargs)
        stop = time.time()
        print(stop - start)
        return res
    return wrapper
 
help = outter(help)
others = outter(others)
 
res1=help(1, 2, 3)
res2=others(4, 5, 6)
print(res1,res2)

沒毛病,跑一下:

 總結: 

到這我們完成了一個簡單的無參裝飾器,裝飾后的func既沒有改變源代碼,也沒有改變調用方式。

但是代碼稍顯冗余,python語法便規定:在被裝飾對象正上方單獨一行寫@裝飾器名字,等價于func=outter(func),簡化代碼。從中我們總結出無參裝飾器的一個模板:

def outter(func):
     def wrapper(*args,**kwargs):
         # 1、調用原函數
         # 2、增加的新功能
         res=func(*args,**kwargs)
         return res
     return wrapper
 
#使用時
@outter
def func:
    pass

到此這篇關于Python無參裝飾器的文章就介紹到這了,更多相關Python無參裝飾器內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python如何定義帶參數的裝飾器
  • python如何修改裝飾器中參數
  • 淺談python裝飾器探究與參數的領取

標簽:普洱 盤錦 漯河 林芝 南平 大同 海南 寧夏

巨人網絡通訊聲明:本文標題《Python無參裝飾器的實現方案及優化》,本文關鍵詞  Python,無參,裝飾,器,的,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python無參裝飾器的實現方案及優化》相關的同類信息!
  • 本頁收集關于Python無參裝飾器的實現方案及優化的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    欧美一区二区三区视频免费播放 | 欧美三级在线看| 国产精品三级av在线播放| 精品中文字幕一区二区| a级大片在线观看| 欧美mv日韩mv国产| 蜜桃精品视频在线| 四虎国产精品成人免费入口| 欧美tickling挠脚心丨vk| 奇米777欧美一区二区| 中文字幕狠狠干| 日韩精品中文字幕一区二区三区| 日韩国产成人精品| 国产精品无码午夜福利| 精品精品欲导航| 精品一区二区成人精品| 亚洲色图第四色| 国产欧美日韩一区二区三区在线观看| 激情综合网av| 日本黄区免费视频观看| 中文字幕一区二区三区精华液| 成人国产精品视频| 欧美色成人综合| 五月天网站亚洲| 一区二区三区四区免费| 国产日本一区二区| 成人天堂资源www在线| 在线观看三级视频欧美| 亚洲v日本v欧美v久久精品| 黄色a一级视频| 久久久久久久久久久黄色| 国产91丝袜在线观看| 日本伦理一区二区| 亚洲va天堂va国产va久| 国产精品亚洲无码| 国产精品天天看| 18深夜在线观看免费视频| 51精品久久久久久久蜜臀| 久久国产精品99久久人人澡| 国产三级aaa| 一区二区三区国产| 疯狂揉花蒂控制高潮h| 欧美国产精品中文字幕| 91天堂素人约啪| 日韩美一区二区三区| 国产激情精品久久久第一区二区 | 日本人亚洲人jjzzjjz| 国产精品久久久久久久久免费樱桃 | 免费一级欧美片在线观看| www.4hu95.com四虎| 亚洲免费观看高清完整版在线观看 | 免费黄色激情视频| 亚洲精选在线视频| 97伦伦午夜电影理伦片| 国产精品久久久久久一区二区三区 | 一区视频在线播放| 亚洲成av人片在线观看无| 久久久国产午夜精品| 99re这里都是精品| 精品久久久久久久久久久久久久久| 成人三级伦理片| 欧美一级一区二区| 岛国精品一区二区| 日韩色视频在线观看| caoporn国产精品| 日韩美女视频在线| 99视频在线精品| 精品国产免费一区二区三区香蕉| eeuss影院一区二区三区 | 日韩欧美国产一区在线观看| 高清成人免费视频| 日韩欧美中文字幕一区| youjizz久久| 久久亚洲综合av| 色哟哟网站在线观看| 国产日韩欧美一区二区三区综合| 少妇伦子伦精品无吗| 欧美国产一区视频在线观看| 中国一级特黄录像播放| 亚洲三级在线免费| 欧美巨胸大乳hitomi| 午夜精品久久久久久久久| 精品一区在线观看视频| 久久超碰97人人做人人爱| 欧美日韩国产电影| 成人激情黄色小说| 久久蜜桃一区二区| 性欧美丰满熟妇xxxx性久久久| 国产精品久久午夜夜伦鲁鲁| 国产全是老熟女太爽了| 亚洲国产欧美一区二区三区丁香婷| 精品一区二区在线观看视频| 喷白浆一区二区| 欧美精品亚洲二区| 99re热这里只有精品免费视频| 国产亚洲视频系列| 大黑人交xxx极品hd| 亚洲午夜免费视频| 在线中文字幕一区二区| 国产成人亚洲综合a∨婷婷 | 成人免费在线观看入口| 中文字幕有码在线播放| 日韩av电影免费观看高清完整版在线观看| 色香蕉成人二区免费| 国产成人精品综合在线观看 | 中文字幕制服丝袜一区二区三区 | 日韩国产精品久久久| 欧美日韩亚洲综合一区二区三区| 成人av电影在线网| 国产精品视频麻豆| 波多野结衣喷潮| 国产一区欧美二区| 精品剧情在线观看| 中国美女乱淫免费看视频| 午夜电影网一区| 欧美放荡的少妇| 国产高潮失禁喷水爽到抽搐| 亚洲综合色成人| 欧美最新大片在线看| 99精品久久免费看蜜臀剧情介绍| 一色桃子久久精品亚洲| 加勒比婷婷色综合久久| 国产不卡视频一区二区三区| 久久久久亚洲综合| 欧美xxxx精品| 国产高清不卡一区| 中文字幕欧美激情| 97成人资源站| av一区二区久久| 亚洲乱码国产乱码精品精可以看| 色先锋aa成人| 91蜜桃免费观看视频| 亚洲综合一区在线| 欧美日韩国产另类不卡| 欧美xxxxx精品| 奇米一区二区三区av| 精品电影一区二区三区| 国产黄色大片免费看| 国产精品中文字幕日韩精品| 中文字幕欧美国产| 色婷婷香蕉在线一区二区| 青青草精品在线| 天堂影院一区二区| 精品乱人伦小说| 2017亚洲天堂| 成人avav在线| 亚洲一区二区在线观看视频| 欧美挠脚心视频网站| www.自拍偷拍| 国产精品一卡二卡在线观看| 中文字幕亚洲一区二区va在线| 色八戒一区二区三区| 免费不卡的av| 久久国产精品一区二区| 国产精品蜜臀av| 欧美丝袜第三区| 美女久久久久久久久久| 国产成人免费在线视频| 亚洲精品中文字幕乱码三区| 69堂精品视频| 国产农村妇女精品一区| 91在线精品秘密一区二区| 天堂成人免费av电影一区| www日韩大片| 色综合网色综合| 国产a级黄色片| 激情综合一区二区三区| 亚洲欧洲日产国码二区| 欧美精品在线一区二区| 俄罗斯毛片基地| 91无套直看片红桃| 美女网站视频久久| 中文字幕日本乱码精品影院| 在线电影一区二区三区| 欧美日韩国产一二三区| 日本少妇一区二区三区| 久久99精品网久久| 亚洲精选在线视频| 2023国产一二三区日本精品2022| 色综合一个色综合| 爱爱免费小视频| 成人激情午夜影院| 天天影视涩香欲综合网 | 国产成人免费9x9x人网站视频| 亚洲一区影音先锋| 久久精品亚洲国产奇米99| 欧美影院午夜播放| 亚洲女优在线观看| 91视频.com| 国产乱码精品一区二区三区忘忧草 | ww亚洲ww在线观看国产| 一本到三区不卡视频| 性欧美丰满熟妇xxxx性仙踪林| av午夜一区麻豆| 精品一区二区日韩| 亚洲va天堂va国产va久| 国产精品久久毛片| 精品日本一线二线三线不卡| 一本大道久久a久久综合| 在线观看国产精品一区|