1 問題python
實際生活中,咱們很難一次性就把一個函數代碼寫得天衣無縫。當咱們須要對之前的函數添加新功能時,咱們應該怎麼作?python3.x
2 問題解決思路函數
(1)能夠直接修改原來的函數,在函數內直接修改。當咱們對多個函數都新增這個功能時,這樣修改顯得代碼冗餘。spa
(2)採用裝飾器來解決。裝飾器是python裏面的一種特殊函數(裝飾其它函數),它能夠在函數名以及函數體不改變的前提下,給一個函數附加一些額外代碼。3d
3 簡單裝飾器案例(python3.x)code
3.1 原代碼功能:根據你輸入的內容,輸出你輸入的城市名稱。原代碼以下。blog
1 def bj(): 2 print("北京!") 3 4 def sz(): 5 print("深圳!") 6 7 def sh(): 8 print("上海!") 9 10 # 功能邏輯 11 chioce = input("請輸入你喜歡的城市名稱:") 12 13 if chioce == "北京": 14 bj() 15 elif chioce == "深圳": 16 sz() 17 else: 18 sh()
上面代碼執行後結果爲:

3.2 如今要添加新功能:在原來的輸出城市名稱前先輸出"你好:"。
3.3 解決方案1:直接在原來的函數裏面添加輸出「你好」相應代碼。修改後的代碼以下:
1 def bj(): 2 print("你好:北京!") 3 4 def sz(): 5 print("你好:深圳!") 6 7 def sh(): 8 print("你好:上海!") 9 10 # 功能邏輯 11 chioce = input("請輸入你喜歡的城市名稱:") 12 13 if chioce == "北京": 14 bj() 15 elif chioce == "深圳": 16 sz() 17 else: 18 sh()
上面代碼執行後結果爲:圖片
3.3 解決方案2:把新增功能寫到一個新的函數裏面,這個新的函數就是裝飾器。修改後代碼以下:
1 # 裝飾器函數 2 def hello(func): 3 def innner(): 4 print("你好:", end='') 5 func() 6 return innner 7 8 @hello 9 def bj(): 10 print("北京!") 11 12 @hello 13 def sz(): 14 print("深圳!") 15 16 @hello 17 def sh(): 18 print("上海!") 19 20 # 功能邏輯 21 chioce = input("請輸入你喜歡的城市名稱:") 22 23 if chioce == "北京": 24 bj() 25 elif chioce == "深圳": 26 sz() 27 else: 28 sh()
上面代碼執行後結果爲:input
4 複雜裝飾器案例(python3.x) io
4.1 代碼功能:根據選擇進入不一樣區域,如圖片區域或音樂區域。原代碼以下,
1 def ftp(): 2 print("這裏是圖片區") 3 4 def fyy(): 5 print("這裏是音樂區") 6 7 8 # 功能代碼 9 ychoice = input("請輸如的你的選擇:") 10 11 if ychoice == "1": 12 ftp() 13 elif ychoice == "2": 14 fyy() 15 else: 16 print("輸入錯誤:請輸入1或2!")
上面代碼執行後結果爲:

4.2 須要新增的功能:根據不一樣狀況,在輸出時首先輸出"---------------------------"或者"****************************"的分隔符。
4.3 使用裝飾器來增長這個新功能,修改後的代碼以下,
1 def login(char): 2 def checkin(func): 3 def inner(): 4 print(char * 50) 5 func() 6 return inner 7 return checkin 8 9 @login("*") 10 def ftp(): 11 print("這裏是圖片區") 12 13 @login("-") 14 def fyy(): 15 print("這裏是音樂區") 16 17 # 邏輯功能 18 ychoice = input('''請輸如的你的選擇:''') 19 20 if ychoice == "1": 21 ftp() 22 elif ychoice == "2": 23 fyy() 24 else: 25 print("輸入錯誤:請輸入'1'或者'2'!")
上面代碼執行後結果爲:

2018-08-12