python——函数之装饰器

时间:2023-03-08 20:06:52

1 问题

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

2 问题解决思路

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

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

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

  3.1 原代码功能:根据你输入的内容,输出你输入的城市名称。原代码如下。

 def bj():
print("北京!") def sz():
print("深圳!") def sh():
print("上海!") # 功能逻辑
chioce = input("请输入你喜欢的城市名称:") if chioce == "北京":
bj()
elif chioce == "深圳":
sz()
else:
sh()
  上面代码执行后结果为:
    python——函数之装饰器

  
3.2 现在要添加新功能:在原来的输出城市名称前先输出"你好:"。   3.3 解决方案1:直接在原来的函数里面添加输出“你好”相应代码。修改后的代码如下:
 def bj():
print("你好:北京!") def sz():
print("你好:深圳!") def sh():
print("你好:上海!") # 功能逻辑
chioce = input("请输入你喜欢的城市名称:") if chioce == "北京":
bj()
elif chioce == "深圳":
sz()
else:
sh()

   上面代码执行后结果为:

    python——函数之装饰器

   3.3 解决方案2:把新增功能写到一个新的函数里面,这个新的函数就是装饰器。修改后代码如下:
 # 装饰器函数
def hello(func):
def innner():
print("你好:", end='')
func()
return innner @hello
def bj():
print("北京!") @hello
def sz():
print("深圳!") @hello
def sh():
print("上海!") # 功能逻辑
chioce = input("请输入你喜欢的城市名称:") if chioce == "北京":
bj()
elif chioce == "深圳":
sz()
else:
sh()

    上面代码执行后结果为:

     python——函数之装饰器

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

    4.1 代码功能:根据选择进入不同区域,如图片区域或音乐区域。原代码如下,

 def ftp():
print("这里是图片区") def fyy():
print("这里是音乐区") # 功能代码
ychoice = input("请输如的你的选择:") if ychoice == "1":
ftp()
elif ychoice == "2":
fyy()
else:
print("输入错误:请输入1或2!")
  上面代码执行后结果为:
    python——函数之装饰器
4.2 需要新增的功能:根据不同情况,在输出时首先输出"---------------------------"或者"****************************"的分隔符。

4.3 使用装饰器来增加这个新功能,修改后的代码如下,
 def login(char):
def checkin(func):
def inner():
print(char * 50)
func()
return inner
return checkin @login("*")
def ftp():
print("这里是图片区") @login("-")
def fyy():
print("这里是音乐区") # 逻辑功能
ychoice = input('''请输如的你的选择:''') if ychoice == "":
ftp()
elif ychoice == "":
fyy()
else:
print("输入错误:请输入'1'或者'2'!")
  上面代码执行后结果为:
    python——函数之装饰器
2018-08-12