当前位置: 移动技术网 > IT编程>脚本编程>Python > python——函数之装饰器

python——函数之装饰器

2018年08月13日  | 移动技术网IT编程  | 我要评论

王石女儿,自主择业网,jessicadrake

1 问题

  实际生活中,我们很难一次性就把一个函数代码写得完美无缺。当我们需要对以前的函数添加新功能时,我们应该怎么做?

 

2 问题解决思路

   (1)可以直接修改原来的函数,在函数内直接修改。当我们对多个函数都新增这个功能时,这样修改显得代码冗余。

  (2)采用装饰器来解决。装饰器是python里面的一种特殊函数(装饰其它函数),它可以在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码。

 

3 简单装饰器案例(python3.x)

  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.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()

     上面代码执行后结果为:

     

 

4 复杂装饰器案例(python3.x)   

    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
  
 
      

    

  

  

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网