IT培訓(xùn)網(wǎng)
IT在線學(xué)習(xí)
裝飾器函數(shù)是在不改變原來函數(shù)的情況下,添加額外功能的函數(shù)。裝飾器函數(shù)內(nèi)部還有一個函數(shù),返回值是內(nèi)部函數(shù)名。定義裝飾器函數(shù)的語法格式如下:
def 裝飾器函數(shù)名(參數(shù)1):
函數(shù)體
def 內(nèi)部函數(shù)名(參數(shù)2):
函數(shù)體
return 內(nèi)部函數(shù)名
其中,參數(shù)1接收原函數(shù)的函數(shù)名;參數(shù)2接收原函數(shù)的參數(shù)。
例如,某月餅零售價為5元一個,但是禮盒裝月餅(8個裝)為200元一盒,那么同樣的月餅,使用禮盒包裝后,可能就加價160元。
首先定義兩個函數(shù),一個是月餅函數(shù),另一個是禮盒函數(shù)。
定義月餅函數(shù),代碼如下:
def cake():
print('五仁月餅零售價5元')
調(diào)用月餅函數(shù),代碼如下:
cake()
調(diào)用月餅函數(shù)后,運行結(jié)果:
五仁月餅零售價5元
定義禮盒函數(shù),代碼如下:
def box():
print('禮盒加價160元')
def get_cake():
cake()
調(diào)用禮盒函數(shù),代碼如下:
box()
調(diào)用禮盒函數(shù)后,運行結(jié)果:
禮盒加價160元
運行結(jié)果顯然不符合預(yù)期,沒有打印“五仁月餅零售價5元”,這是因為只是在禮盒函數(shù)內(nèi)定義了get_cake()函數(shù),但是沒有調(diào)用這個函數(shù)。修改禮盒函數(shù),代碼如下:
def box():
print('禮盒加價160元')
def get_cake():
cake()
get_cake() # 調(diào)用函數(shù)
再次調(diào)用禮盒函數(shù)后,運行結(jié)果:
禮盒加價160元
五仁月餅零售價5元
但是,同一種禮盒可能會裝不同的月餅,現(xiàn)有三種月餅分別為五仁、豆沙、蛋黃,這三種月餅的零售價分別為5元、5元、8元。
定義豆沙月餅函數(shù),代碼如下:
def cake1():
print('豆沙月餅零售價5元')
定義蛋黃月餅函數(shù),代碼如下:
def cake2():
print('蛋黃月餅零售價8元')
下面分別給禮盒函數(shù)傳遞三個原函數(shù)的名稱,修改禮盒函數(shù),代碼如下:
def box(fun): # 添加參數(shù)
print('禮盒加價160元')
def get_cake():
fun()
get_cake()
這樣就分別實現(xiàn)了三種打印效果,三種月餅都可以被禮盒包裝了。
重新調(diào)用禮盒函數(shù),代碼如下:
box(cake)
box(cake1)
box(cake2)
調(diào)用禮盒函數(shù)后,運行結(jié)果:
禮盒加價160元
五仁月餅零售價5元
禮盒加價160元
豆沙月餅零售價5元
禮盒加價160元
蛋黃月餅零售價8元
目前月餅函數(shù)是無參數(shù)、無返回值的。給月餅函數(shù)添加返回值,代表月餅的個數(shù),代碼如下:
def cake():
print('五仁月餅零售價5元')
return 4 # 添加返回值
而禮盒函數(shù)也需要進行相應(yīng)的修改,代碼如下:
def box(fun):
print('禮盒加價160元')
def get_cake():
num = fun()
return num
return get_cake()
調(diào)用禮盒函數(shù),代碼如下:
nums = box(cake)
print('獲取數(shù)量:%d' % nums)
調(diào)用禮盒函數(shù)后,運行結(jié)果:
禮盒加價160元
五仁月餅零售價5元
獲取數(shù)量:4
目前原函數(shù)是cake(),其裝飾器函數(shù)是box()。Python中,原函數(shù)和裝飾器函數(shù)的修飾關(guān)系類似于月餅和禮盒的關(guān)系。在定義原函數(shù)之前,使用“@+裝飾器函數(shù)名”的形式得到裝飾關(guān)系。
給月餅函數(shù)添加修飾關(guān)系,代碼如下:
@box
def cake():
print('五仁月餅零售價5元')
return 4
而禮盒函數(shù)也需要進行相應(yīng)的修改,代碼如下:
def box(fun):
print('禮盒加價160元')
def get_cake():
num = fun()
return num
return get_cake # 返回值中刪除函數(shù)名后的括號
在調(diào)用時不需要再寫禮盒函數(shù)名,就像最終吃的是月餅,因此,直接調(diào)用月餅函數(shù)即可,代碼如下:
nums = cake()
print('獲取數(shù)量:%d' % nums)
調(diào)用月餅函數(shù)后,運行結(jié)果:
禮盒加價160元
五仁月餅零售價5元
獲取數(shù)量:4
由運行結(jié)果可知,此時不需要寫修飾器函數(shù)名,也可達到同樣的效果,這說明了裝飾器的作用。
常見的函數(shù)一般是有參數(shù)的,裝飾器函數(shù)的參數(shù)用于接收原函數(shù)名,內(nèi)部函數(shù)的參數(shù)用于接收原函數(shù)的參數(shù)。有時原函數(shù)中參數(shù)的數(shù)量和類型是無法事先確定的,可以使用*args和**kwargs,即可變位置參數(shù)和可變關(guān)鍵字參數(shù),這樣無論任何參數(shù)都可以接收。
修改月餅函數(shù),添加參數(shù)n,代表月餅的個數(shù),代碼如下:
@box
def cake(n): # 添加參數(shù)
print('五仁月餅零售價5元')
return n # 修改返回值
而禮盒函數(shù)也需要進行相應(yīng)的修改,代碼如下:
def box(fun):
print('禮盒加價160元')
def get_cake(*args, **kwargs): # 內(nèi)部函數(shù)添加參數(shù)
num = fun(*args, **kwargs)
return num
return get_cake
再次調(diào)用月餅函數(shù),代碼如下:
nums = cake(4)
print('獲取數(shù)量:%d' % nums)
再次調(diào)用月餅函數(shù)后,運行結(jié)果:
禮盒加價160元
五仁月餅零售價5元
獲取數(shù)量:4
更多內(nèi)容
>>本文地址:http://www.yiyunku.cn/zhuanye/2021/69430.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學(xué)歷
3 您更想做哪個方向的工作?