python——函數之裝飾器

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  
相關文章
相關標籤/搜索