欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的@裝飾器的作用小結(jié)

 更新時間:2021年11月23日 14:50:26   作者:Python學習與數(shù)據(jù)挖掘  
本文給大家講解Python的@裝飾器的用途,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

我們在編程過程中,常常會遇到這種需求:

比如,我想開發(fā)一款計算器,我已經(jīng)寫好了一堆函數(shù),用于執(zhí)行各種計算,那么我們需要在執(zhí)行各種計算函數(shù)前,首先對輸入的數(shù)據(jù)進行檢查,確保他們必須得是數(shù)值才允許執(zhí)行函數(shù),而不能是字符串;

又如,我想編寫一個用于計算三角形周長、面積、某個角角度的模塊,已經(jīng)寫好幾個函數(shù)用于計算,那么,在執(zhí)行計算前,首先要確保輸入的三條邊長能夠構(gòu)成三角形,再進行計算才有意義;

再比如,我想開發(fā)某款網(wǎng)絡應用,寫了一些函數(shù)用于實現(xiàn)用戶的某些操作,那么,得要先檢查確認該用戶已經(jīng)登錄了,才允許執(zhí)行這些操作。

這些需求,歸納起來,就是,在執(zhí)行主函數(shù)之前,常常要先執(zhí)行某個預函數(shù),進行一些校驗之類的操作。

這類需求是非常常見的,也是保證程序完整性、健壯性的重要舉措。所以,怎么做才比較簡單呢?

你會說,這很簡單啊,在每個函數(shù)里面寫上if語句不就得了。就拿那個計算器而言,如果我們要寫加減乘除,我們可以這樣:

def plus(a,b):
    if type(a)==type(0) and type(b)==type(0): #假設該計算器只能計算整數(shù),如果要計算小數(shù)再or type(0.0)
        return a+b
    else:
        print('Type must be number') #檢測到數(shù)據(jù)類型不對,先輸出報警,函數(shù)值返回None
        return None

def minus(a,b):
    if type(a)==type(0) and type(b)==type(0):
        return a-b
    else:
        print('Type must be number')
        return None

def multiply(a,b):
    if type(a)==type(0) and type(b)==type(0):
        return a*b
    else:
        print('Type must be number')
        return None

def divide(a,b):
    if type(a)==type(0) and type(b)==type(0):
        return a/b
    else:
        print('Type must be number')
        return None

這個嘛,直接暴力。但是呢,這里只有4個函數(shù),假如你開發(fā)的計算器有幾十幾百個函數(shù),每個函數(shù)都要套上if語句,這不得麻煩死了,不煩死也啰嗦死了。

所以怎么弄簡單一點呢?聰明的你肯定想到了,我們可以把那個判斷if也單獨定義一個函數(shù),然后把計算用的函數(shù)套在里面,就像這樣:

def check(a,b,func): #定義檢查函數(shù),變量為待檢測參數(shù)a,b和檢測通過后執(zhí)行的函數(shù)func
    if type(a)==type(0) and type(b)==type(0):
        return func(a,b)
    else:
        print('Type must be number')
        return None

def plus(a,b):
    return a+b

def minus(a,b):
    return a-b
...

#主程序
check(1,2,plus) #計算1+2
check(1,2,minus) #計算1-2
check(1,2,multiply) #計算1*2
check(1,2,divide) #計算1/2

這里面有一點一定要特別注意,主程序的check(1,2,plus) 是把plus函數(shù)本身作為變量傳遞給check,由check函數(shù)決定如何執(zhí)行plus函數(shù),此處不能寫成check(1,2,plus(1,2)),plus不能帶參數(shù)和括號,不是執(zhí)行plus()后把結(jié)果傳給check。

這么寫程序簡潔了不少,加減乘除函數(shù)只需要定義他們本身的運算就可以了,變量檢測交給了check函數(shù)。這么寫也是比較容易理解的。

但是對于使用該程序的用戶來說,就不是這么回事了,他們會覺得這么寫非常難看。

為什么呢?我是要拿程序做加減乘除計算的,但我不論計算什么,每次都是在主調(diào)用check這個函數(shù)

那有沒有什么辦法,可以既好看,又簡潔呢?裝飾器就是起到了這個神奇的作用。

上面這個需求,用裝飾器可以這么寫:

def check(func):
    ...

@check
def plus(a,b):
    return a+b

@check
def minus(a,b):
    return a-b

...

#主程序
plus(1,2) #計算1+2
minus(1,2) #計算1-2
...

先直觀感受一下,通過@check,check函數(shù)就被“注入”到了plus函數(shù)中,使得plus函數(shù)擁有了參數(shù)檢測的功能。這樣,在主程序中,若要計算加法就可直接調(diào)用plus,便可先校驗再計算。

那么,這個裝飾器check要怎么定義呢?我們來看一下。

def check(func): #定義裝飾器check
    def newfunc(a,b): #定義函數(shù)模板,即如何處理func
        if type(a)==type(0) and type(b)==type(0):
            return func(a,b)
        else:
            print('Type must be number!')
            return None
    return newfunc #將處理后的func作為新函數(shù)newfunc輸出

@check
def plus(a,b):
    return a+b

#主程序,計算1+2
plus(1,2)

我們可以看到,當裝飾器@check作用于plus函數(shù)時,plus函數(shù)本身作為參數(shù)func傳入裝飾器中。在裝飾器check的定義內(nèi)部,定義了一個函數(shù)模板,描述了對輸入的func如何處理??梢钥吹?,newfunc對func(也就是輸入的plus)套用了判斷數(shù)據(jù)類型的if語句,最后,再將套好的newfunc輸出,替代原來的func。這樣,此時執(zhí)行func就是在執(zhí)行newfunc,執(zhí)行plus就是在執(zhí)行套上if語句的新函數(shù)。

所以,通過裝飾器,添加上了判斷語句的新函數(shù)替換了原來的plus函數(shù),但仍通過plus這個函數(shù)名調(diào)用,所以看起來就是plus函數(shù)被“裝飾”了。

當然了,如果大家在網(wǎng)絡上搜索,關于如何定義裝飾器,看到的是一個更加規(guī)范的版本??雌饋砀y理解一些,但其實是一樣的:

def checkall(func):
    def wrapper(*args,**kwargs):
        if type(args[0])==type(0) and type(args[1])==type(0):
            return func(*args,**kwargs)
        else:
            print('Type must be number!')
            return None
    return wrapper

模板函數(shù)一般習慣用wrapper來表示,這個沒啥,建議大家都這么寫,規(guī)范一些。

參數(shù)一般用不定長的*args,**kwargs來表示,這個可能有些人就困惑了。因為被裝飾的函數(shù)可能有很多種,參數(shù)的個數(shù)一般也不確定。然后*args,**kwargs是什么東西?args,kwargs這兩個形參英文字母是什么無所謂可以自己定,關鍵是前面的單星號*和雙星號**。

假如我定義一個函數(shù),不能確定參數(shù)有多少個,例如要對輸入的一組數(shù)字做連加操作。那么就可以定義plus(*x),當調(diào)用該函數(shù)時,若輸入多個變量plus(1,2,3),那么就會把輸入的變量組合成一個元祖x=(1,2,3)輸入。定義雙星號plus(**x)的意思是,調(diào)用該函數(shù)時若寫出形參變量plus(a=1,b=2,c=3),那么輸入變量就會組合成字典x={a:1,b:2,c:3}傳入函數(shù)。

當然也可以反向操作,定義函數(shù)的時候參數(shù)個數(shù)是明確的plus(a,b,c),那么調(diào)用該函數(shù)時,加上星號plus(*(1,2,3)),就是對輸入元祖(1,2,3)執(zhí)行炸開操作,轉(zhuǎn)換為plus(1,2,3)輸入。

裝飾器里這么寫有什么用呢?我們仔細觀察一下我們之前寫的newfunc(a,b),那就意味著,指明了新函數(shù)有兩個參數(shù)a,b,假如被裝飾的原函數(shù)有三個參數(shù)怎么辦呢?不就沒用了嗎?

我們來看別人寫的,定義時用了wrapper(*args,**kwargs),即不管有多少個參數(shù),打包輸入wrapper。在wrapper當中,調(diào)用原函數(shù)時又func(*args,**kwargs),即把輸入的元祖解包再傳入func。這么一打包一解包,雖然看起來啥都沒干,但確適應了函數(shù)參數(shù)不確定的情況,使得該裝飾器可以裝飾多種參數(shù)數(shù)量不同的函數(shù)。

就先這樣吧。

到此這篇關于Python的@裝飾器是干什么用的?的文章就介紹到這了,更多相關Python @裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一篇文章帶你了解python正則表達式的正確用法

    一篇文章帶你了解python正則表達式的正確用法

    這篇文章主要介紹了Python中正則表達式的詳細教程,正則表達式是Python學習進階當中的重要內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解Python的單元測試

    詳解Python的單元測試

    這篇文章主要介紹了Python的單元測試,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python實現(xiàn)的下載8000首兒歌的代碼分享

    Python實現(xiàn)的下載8000首兒歌的代碼分享

    這篇文章主要介紹了Python實現(xiàn)的下載8000首兒歌的代碼分享,本文直接給出實現(xiàn)代碼,下載的是有伴網(wǎng)的資源,需要的朋友可以參考下
    2014-11-11
  • Python使用Pillow實現(xiàn)圖像基本變化

    Python使用Pillow實現(xiàn)圖像基本變化

    這篇文章主要為大家詳細介紹了Python如何使用Pillow實現(xiàn)圖像的基本變化處理,文中的示例代碼講解詳細,具有一定的學習價值,需要的可以了解一下
    2022-10-10
  • Python繪制3D立體花朵示例詳解

    Python繪制3D立體花朵示例詳解

    情人節(jié)送玫瑰花千篇一律?本文將為大家介紹利用Python繪制多種3D立體花朵的示例代碼,讓女友感受一下程序員的浪漫!快來跟隨小編一起學習一下吧
    2021-12-12
  • Python3實戰(zhàn)之爬蟲抓取網(wǎng)易云音樂的熱門評論

    Python3實戰(zhàn)之爬蟲抓取網(wǎng)易云音樂的熱門評論

    這篇文章主要給大家介紹了關于Python3實戰(zhàn)之爬蟲抓取網(wǎng)易云音樂熱評的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • python?協(xié)程并發(fā)數(shù)控制

    python?協(xié)程并發(fā)數(shù)控制

    這篇文章主要介紹了python?協(xié)程并發(fā)數(shù)控制,文章基于python的相關資料展開對主題煩人詳細內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • python 中split 和 strip的實例詳解

    python 中split 和 strip的實例詳解

    這篇文章主要介紹了 python 中split 和 strip的實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • 使用Python破解RAR文件密碼的代碼實例

    使用Python破解RAR文件密碼的代碼實例

    這篇文章主要介紹了使用Python破解RAR文件密碼的代碼實例,rar 壓縮文件資源又不少是被加密的,密碼通常也比較簡單,我們可以通過暴力破解的方式來獲取,通常耗時也比較小,需要的朋友可以參考下
    2023-11-11
  • python+selenium實現(xiàn)QQ郵箱自動發(fā)送功能

    python+selenium實現(xiàn)QQ郵箱自動發(fā)送功能

    這篇文章主要為大家詳細介紹了python+selenium實現(xiàn)QQ郵箱自動發(fā)送功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論