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

文章“【Python基礎知識】Python裝飾器函數概念”已幫助

更多內容

>>本文地址:http://www.028benet.com/zhuanye/2021/69430.html

THE END  

聲明:本站稿件版權均屬中公教育優就業所有,未經許可不得擅自轉載。

1 您的年齡

2 您的學歷

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

獲取測試結果
  • 大前端大前端
  • 大數據大數據
  • 互聯網營銷互聯網營銷
  • JavaJava
  • Linux云計算Linux
  • Python+人工智能Python
  • 嵌入式物聯網嵌入式
  • 全域電商運營全域電商運營
  • 軟件測試軟件測試
  • 室內設計室內設計
  • 平面設計平面設計
  • 電商設計電商設計
  • 網頁設計網頁設計
  • 全鏈路UI/UE設計UI設計
  • VR/AR游戲開發VR/AR
  • 網絡安全網絡安全
  • 新媒體與短視頻運營新媒體
  • 直播帶貨直播帶貨
  • 智能機器人軟件開發智能機器人
 

快速通道fast track

近期開班時間TIME

主站蜘蛛池模板: 特黄特色大片免费播放| 丰满老熟好大bbb| 人人澡人人爽人人| 日本一区二区免费看| 免费在线视频a| xxxx日本视频| 男女啪啪免费观看网站| 女网址www女高清中国| 亚洲美女人黄网成人女| 99精品中文字幕| 欧美精品在线观看| 国产乱了真实在线观看| 中文字幕色综合久久| 精品日本一区二区三区在线观看| 国产老买老妇bbb| 亚洲人精品亚洲人成在线| 222www免费视频| 日产乱码卡一卡2卡3卡.章节| 午夜爽爽试看5分钟| www99re| 最近免费中文字幕大全高清大全1| 国产妇女馒头高清泬20P多毛| 久久精品九九亚洲精品| 理论片中文字幕在线观看| 国产精品素人福利| 久热这里只有精品12| 视频免费在线观看| 性做久久久久久久| 亚洲精品短视频| 国产成人精品1024在线| 新木乃伊电影免费观看完整版| 免费无码又爽又刺激高潮的视频| 久久五月天综合网| 成人午夜小视频| 亚洲精品乱码久久久久久蜜桃图片| 调教视频在线观看| 国产高清一级毛片在线不卡| 久久综合第一页| 波多野结衣同性系列698| 啦啦啦手机完整免费高清观看 | 精品无码久久久久久久久|