婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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無參裝飾器的實現方案及優化的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    天天综合色天天综合色h| 国产精品嫩草久久久久| 亚洲成人自拍偷拍| 国产精品成人一区二区艾草| 风间由美一区二区av101 | 精品国产精品网麻豆系列| 中文字幕中文字幕在线一区| 亚洲综合免费观看高清完整版 | 欧美色综合影院| 欧美精品一区二区三区一线天视频 | ...xxx性欧美| 亚洲国产精品国自产拍av| 亚洲激情自拍偷拍| 国产在线日韩欧美| 在线亚洲高清视频| 久久综合狠狠综合久久综合88 | 色狠狠综合天天综合综合| 日韩区在线观看| 国产精品嫩草影院av蜜臀| 午夜精品久久久久久| 99视频超级精品| 欧美一卡二卡在线观看| 亚洲伦理在线精品| 1区2区3区国产精品| 精品乱码亚洲一区二区不卡| 婷婷夜色潮精品综合在线| 国产精品视频看| 国产一区二区三区不卡在线观看| 欧美在线一区二区三区| 69久久夜色精品国产69蝌蚪网| 国产亚洲综合av| 久久99久国产精品黄毛片色诱| 欧美精品日韩综合在线| 亚洲精品五月天| 国内久久婷婷综合| 在线播放欧美女士性生活| 亚洲国产高清不卡| 狠狠色丁香久久婷婷综合_中| 久久综合999| 精品一区二区免费视频| 91精品办公室少妇高潮对白| 亚洲电影欧美电影有声小说| 色综合久久久久综合99| 亚洲一区影音先锋| 欧美在线不卡视频| 亚洲国产一区二区a毛片| 色婷婷av一区二区三区大白胸| 欧美日韩国产首页在线观看| 国产亚洲精品久| 亚洲宅男天堂在线观看无病毒| 国产九九视频一区二区三区| 精品久久人人做人人爱| 69精品人人人人| 久久综合久久久久88| 亚洲免费观看高清在线观看| 成人黄色网址在线观看| 一区二区三区在线视频播放| 成人精品高清在线| 日本一区二区三区视频视频| 国产精品99久久久久久久vr | 日韩视频免费观看高清完整版 | 在线播放/欧美激情| 国产日产欧产精品推荐色| 欧美成人性战久久| 精品一区二区三区在线观看 | 国产精品综合二区| 日韩国产欧美在线播放| 国产不卡视频一区| 青青草国产精品亚洲专区无| 欧美日韩中文一区| 国产精品99久久久| 精品国产凹凸成av人网站| 精品一区二区三区在线观看| 国产欧美视频一区二区| 国产不卡在线播放| 国产精品丝袜在线| 欧美一区二区三区电影| 久久精品欧美一区二区三区不卡| 91视频一区二区三区| 亚洲午夜久久久久久久久久久| 亚洲一区二区四区蜜桃| 91丨九色丨蝌蚪富婆spa| 久久亚洲一区二区三区明星换脸| 日本高清不卡一区| 一级做a爱片久久| 激情久久五月天| 成人av资源网站| 亚洲激情校园春色| 欧美午夜一区二区| 免费看精品久久片| 欧美影视一区在线| 欧美成人一区二区三区| 日韩精品一区二区三区swag| 国产成人免费高清| 蜜桃av一区二区| 久久久影院官网| 国产精品1024| 亚洲成人av电影| 91精品国产综合久久小美女| 久久激情综合网| 亚洲尤物在线视频观看| 亚洲地区一二三色| 制服丝袜在线91| 99精品久久只有精品| 国产高清在线精品| 青青草国产精品亚洲专区无| 亚洲六月丁香色婷婷综合久久 | 久久久亚洲精品一区二区三区| 在线观看一区二区视频| 91丨九色丨黑人外教| 久久综合色婷婷| 欧美日本一道本| 亚洲日本va午夜在线电影| 夜色激情一区二区| 欧美大片在线观看一区二区| 久久er99热精品一区二区| 一区二区三区在线视频免费观看| 欧美亚洲丝袜传媒另类| 成人高清视频在线| 成人伦理片在线| 成人精品视频一区二区三区| 成人h精品动漫一区二区三区| 捆绑调教美女网站视频一区| 天天综合日日夜夜精品| 国产精品综合久久| 国产在线观看一区二区| 麻豆久久久久久久| 欧美亚洲一区二区在线观看| 一区二区三区四区乱视频| 久久精品水蜜桃av综合天堂| 成人一道本在线| 99re热视频精品| 丁香激情综合国产| 国产精品美女久久久久久久久久久 | 国产一区二区三区四区五区美女 | 国产精品自产自拍| 亚洲国产成人在线| 夜夜精品浪潮av一区二区三区| 国产精品久久久久久福利一牛影视| 国产精品欧美久久久久无广告| 国产欧美一区二区三区在线看蜜臀 | 国产麻豆精品视频| 欧美性生活久久| 91在线视频播放| 国产成人精品影视| 欧美区视频在线观看| 成人免费在线观看入口| 不卡欧美aaaaa| 一区二区在线观看av| 国产精品影视在线| 精品国产精品一区二区夜夜嗨| 久久99精品久久只有精品| 久久综合中文字幕| 国产成人8x视频一区二区| 日韩精品一区二区三区在线播放 | 精品久久久久久综合日本欧美| 亚洲成人激情自拍| 欧美电影一区二区| 亚洲在线中文字幕| 成人动漫一区二区在线| 日本一区二区成人| 成人国产精品免费观看视频| 亚洲精品国产成人久久av盗摄| 在线成人午夜影院| 欧美一级高清片| 国产精品一区二区x88av| 欧美大片拔萝卜| 在线看国产日韩| 视频一区视频二区中文| 欧美国产1区2区| 51精品久久久久久久蜜臀| 日韩一区二区三免费高清| 99久久精品国产导航| 国产宾馆实践打屁股91| 国产精品亚洲视频| 精品免费99久久| 国产亚洲精品资源在线26u| ...xxx性欧美| 蜜臀精品久久久久久蜜臀| 国产高清亚洲一区| 奇米影视一区二区三区| 久久国产日韩欧美精品| 99视频精品全部免费在线| 风流少妇一区二区| 精品国产青草久久久久福利| 亚洲欧美视频在线观看| 国产在线国偷精品免费看| 91丝袜美女网| 亚洲成a天堂v人片| 91亚洲精品久久久蜜桃| 久久久久久久久久久久久夜| 五月激情综合色| 欧美日韩国产综合一区二区| 欧美在线观看一二区| 26uuu国产电影一区二区| 欧美乱妇15p| 国产色产综合色产在线视频| 国产精品青草综合久久久久99| 日韩电影免费一区| 波多野结衣91|