什么是装饰器?
装饰器本质上就是函数闭包
装饰器有什么用?
装饰器可以在不改变原有函数代码的情况下,给函数增加其他功能
装饰器有哪些应用场景
装饰器一般用于登录验证和修改日志
理解装饰器的前提
1.函数可以被作为参数传递到其他函数中
2.函数可以被作为函数返回值返回
3.函数可以像变量那样进行赋值
# 我想玩genshin啊于是我就定义了一个genshin函数
def genshin():
print('你好,我是提瓦特第一应急食品派蒙')
# 我又想玩泰拉瑞亚,于是我又定义了一个terrarir函数
def terrarir():
print("淦死渔夫!!")
# 游戏现在是可以玩了,但是玩之前还得登录验证,可是我不想修改原来的函数,于是我创建了一个助手来帮忙进行验证
# 我将游戏函数作为参数传递给了助手
def assistant(game):
def inner():
print('欢迎使用游戏助手')
admin = input('请输入你的游戏账号: ')
password = input('请输入游戏密码: ')
if admin == 'admin' and password == 'admin':
game()
print('感谢你使用游戏助手,下次再来哟')
# 将inner函数作为返回值返回
return inner
# 现在我就要开始玩游戏了
assistant(genshin)
>>欢迎使用游戏助手
>>请输入你的游戏账号: admin
>>请输入游戏密码: admin
>>你好,我是提瓦特第一应急食品派蒙
>>感谢你使用游戏助手,下次再来哟
# 这是我没加装饰器时候的用法,怎么加装饰器呢?很简单在对应函数上方加上@+函数名
@assistant
def genshin():
print('你好,我是提瓦特第一应急食品派蒙')
genshin()
# 这样的执行的效果和上面是一样的: genshin()相当于assistant(genshin)
@assistant
def terrarir():
print("淦死渔夫!!")
# 同样的在泰拉瑞亚函数上面加上装饰器
terrarir()
>>欢迎使用游戏助手
>>请输入你的游戏账号: admin
>>请输入游戏密码: admin
>>淦死渔夫!!
>>感谢你使用游戏助手,下次再来哟
# 这样我就在没有修改原有函数的基础上给函数增加了一个登录校验的功能
# 游戏登录上去了,可是泰拉瑞亚我有很多个存档我还要选择一个存档进行游玩
@assistant
def terrarir(archive): # 我给泰拉瑞亚增加了一个存档参数,登录成功以后可以选择存档
print("淦死渔夫!!")
return f'欢迎进入{archive}'
# 同样的我得在装饰器函数里面添加一个参数并且要有返回值
def assistant(game):
# *args是位置参数,**kwargs是关键参数,这样不管函数有几个传递参数都可以解决
def inner(*args, **kwargs):
print('欢迎使用游戏助手')
admin = input('请输入你的游戏账号: ')
password = input('请输入游戏密码: ')
if admin == 'admin' and password == 'admin':
result = game(*args, **kwargs)
print('感谢你使用游戏助手,下次再来哟')
# 返回所调用函数的返回值,这样装饰器才会有返回值
return result
# 将inner函数作为返回值返回
return inner
print(terrarir('萌新之家'))
>>欢迎使用游戏助手
>>请输入你的游戏账号: admin
>>请输入游戏密码: admin
>>淦死渔夫!!
>>欢迎进入萌新之家
>>感谢你使用游戏助手,下次再来哟
从上面我们可以得到通用装饰器的写法
def assistant(game):
# *args是位置参数,**kwargs是关键参数,这样不管函数有几个传递参数都可以解决
def inner(*args, **kwargs):
admin = input('请输入你的游戏账号: ')
password = input('请输入游戏密码: ')
if admin == 'admin' and password == 'admin':
result = game(*args, **kwargs)
# 返回所调用函数的返回值,这样装饰器才会有返回值
return result
# 将inner函数作为返回值返回
return inner
在遇到需要用到的装饰器的应用场景,先把这个写下来然后在根据具体的函数内容来进行修改就可以了