<noframes id="xh9jd"><menuitem id="xh9jd"></menuitem>

      <address id="xh9jd"></address>

        <ol id="xh9jd"><th id="xh9jd"><span id="xh9jd"></span></th></ol>

        <noframes id="xh9jd">

        400-650-7353

        精品課程

        您所在的位置:首頁 > IT干貨資料 > python > 【Python基礎知識】Python裝飾器函數概念

        【Python基礎知識】Python裝飾器函數概念

        • 發布: python培訓
        • 來源:
        • 2021-07-26 14:47:29
        • 閱讀()
        • 分享
        • 手機端入口

        裝飾器函數是在不改變原來函數的情況下,添加額外功能的函數。裝飾器函數內部還有一個函數,返回值是內部函數名。定義裝飾器函數的語法格式如下:

        def 裝飾器函數名(參數1):

        函數體

        def 內部函數名(參數2):

        函數體

        return 內部函數名

        其中,參數1接收原函數的函數名;參數2接收原函數的參數。

        例如,某月餅零售價為5元一個,但是禮盒裝月餅(8個裝)為200元一盒,那么同樣的月餅,使用禮盒包裝后,可能就加價160元。

        首先定義兩個函數,一個是月餅函數,另一個是禮盒函數。

        定義月餅函數,代碼如下:

        def cake():

        print('五仁月餅零售價5元')

        調用月餅函數,代碼如下:

        cake()

        調用月餅函數后,運行結果:

        五仁月餅零售價5元

        定義禮盒函數,代碼如下:

        def box():

        print('禮盒加價160元')

        def get_cake():

        cake()

        調用禮盒函數,代碼如下:

        box()

        調用禮盒函數后,運行結果:

        禮盒加價160元

        運行結果顯然不符合預期,沒有打印“五仁月餅零售價5元”,這是因為只是在禮盒函數內定義了get_cake()函數,但是沒有調用這個函數。修改禮盒函數,代碼如下:

        def box():

        print('禮盒加價160元')

        def get_cake():

        cake()

        get_cake() # 調用函數

        再次調用禮盒函數后,運行結果:

        禮盒加價160元

        五仁月餅零售價5元

        但是,同一種禮盒可能會裝不同的月餅,現有三種月餅分別為五仁、豆沙、蛋黃,這三種月餅的零售價分別為5元、5元、8元。

        定義豆沙月餅函數,代碼如下:

        def cake1():

        print('豆沙月餅零售價5元')

        定義蛋黃月餅函數,代碼如下:

        def cake2():

        print('蛋黃月餅零售價8元')

        【Python基礎知識】Python裝飾器函數概念

        下面分別給禮盒函數傳遞三個原函數的名稱,修改禮盒函數,代碼如下:

        def box(fun): # 添加參數

        print('禮盒加價160元')

        def get_cake():

        fun()

        get_cake()

        這樣就分別實現了三種打印效果,三種月餅都可以被禮盒包裝了。

        重新調用禮盒函數,代碼如下:

        box(cake)

        box(cake1)

        box(cake2)

        調用禮盒函數后,運行結果:

        禮盒加價160元

        五仁月餅零售價5元

        禮盒加價160元

        豆沙月餅零售價5元

        禮盒加價160元

        蛋黃月餅零售價8元

        目前月餅函數是無參數、無返回值的。給月餅函數添加返回值,代表月餅的個數,代碼如下:

        def cake():

        print('五仁月餅零售價5元')

        return 4 # 添加返回值

        而禮盒函數也需要進行相應的修改,代碼如下:

        def box(fun):

        print('禮盒加價160元')

        def get_cake():

        num = fun()

        return num

        return get_cake()

        調用禮盒函數,代碼如下:

        nums = box(cake)

        print('獲取數量:%d' % nums)

        調用禮盒函數后,運行結果:

        禮盒加價160元

        五仁月餅零售價5元

        獲取數量:4

        目前原函數是cake(),其裝飾器函數是box()。Python中,原函數和裝飾器函數的修飾關系類似于月餅和禮盒的關系。在定義原函數之前,使用“@+裝飾器函數名”的形式得到裝飾關系。

        給月餅函數添加修飾關系,代碼如下:

        @box

        def cake():

        print('五仁月餅零售價5元')

        return 4

        而禮盒函數也需要進行相應的修改,代碼如下:

        def box(fun):

        print('禮盒加價160元')

        def get_cake():

        num = fun()

        return num

        return get_cake # 返回值中刪除函數名后的括號

        在調用時不需要再寫禮盒函數名,就像最終吃的是月餅,因此,直接調用月餅函數即可,代碼如下:

        nums = cake()

        print('獲取數量:%d' % nums)

        調用月餅函數后,運行結果:

        禮盒加價160元

        五仁月餅零售價5元

        獲取數量:4

        由運行結果可知,此時不需要寫修飾器函數名,也可達到同樣的效果,這說明了裝飾器的作用。

        常見的函數一般是有參數的,裝飾器函數的參數用于接收原函數名,內部函數的參數用于接收原函數的參數。有時原函數中參數的數量和類型是無法事先確定的,可以使用*args和**kwargs,即可變位置參數和可變關鍵字參數,這樣無論任何參數都可以接收。

        修改月餅函數,添加參數n,代表月餅的個數,代碼如下:

        @box

        def cake(n): # 添加參數

        print('五仁月餅零售價5元')

        return n # 修改返回值

        而禮盒函數也需要進行相應的修改,代碼如下:

        def box(fun):

        print('禮盒加價160元')

        def get_cake(*args, **kwargs): # 內部函數添加參數

        num = fun(*args, **kwargs)

        return num

        return get_cake

        再次調用月餅函數,代碼如下:

        nums = cake(4)

        print('獲取數量:%d' % nums)

        再次調用月餅函數后,運行結果:

        禮盒加價160元

        五仁月餅零售價5元

        獲取數量:4

        學習疑問申請解答
        您的姓名
        您的電話
        意向課程
         

        中公優就業

        IT小助手

        掃描上方二維碼添加好友,請備注:599,享學習福利。

        >>本文地址:
        注:本站稿件未經許可不得轉載,轉載請保留出處及源文件地址。

        推薦閱讀

        優就業:ujiuye

        關注中公優就業官方微信

        • 關注微信回復關鍵詞“大禮包”,享學習福利
        QQ交流群
        在線疑問解答
        (加群備注“網站”)
        IT培訓交流群 加入群聊 +
        軟件測試 加入群聊 +
        全鏈路UI/UE設計 加入群聊 +
        Python+人工智能 加入群聊 +
        互聯網營銷 加入群聊 +
        Java開發 加入群聊 +
        PHP開發 加入群聊 +
        VR/AR游戲開發 加入群聊 +
        大前端 加入群聊 +
        大數據 加入群聊 +
        Linux云計算 加入群聊 +
        優就業官方微信
        掃碼回復關鍵詞“大禮包”
        享學習福利

        測一測
        你適合學哪門IT技術?

        1 您的年齡

        2 您的學歷

        3 您更想做哪個方向的工作?

        獲取測試結果
         
        課程資料、活動優惠 領取通道