# Demo Describe:装饰器
'''
闭包内容回顾:
1.函数可以作为参数进行传递
2.函数可以作为返回值进行返回
3.函数可以作为变量进行赋值
装饰器:
def warpper(fn):
def inner(*args,**kwargs):
do stuff
ret = fn(*args,**kwargs)
do stuff
return ret
return inner
本质上是一个闭包
作用:
不改变原有函数的情况下,在其前后增加新功能
比如给功能前后添加日志
'''
# start--------1,wrapper的简单使用----------------------
'''
功能
设置一个管家,使其帮助玩家自动实现开关
'''
def guanjia(game):
def inner():
print('开启!')
game()
print('关闭!')
return inner
'''
→@guanjia等同于
playLOL = guanjia(playLOL)
playLOL()
'''
@guanjia
def playLOL():
print('欢迎来到英雌联盟!')
@guanjia
def playPSGame():
print('PS游戏开启!')
# playLOL()
# playPSGame()
# end--------1,wrapper的简单使用----------------------
# start--------2,wrapper的参数使用----------------------
'''
功能
设置一个管家,使其帮助玩家自动实现开关
动态传参
a. *args 接受所有位置参数并存入元组
b. **args 接受所有关键字参数并存入字典
'''
def guanjia(game):
def inner(*args, **kwargs):
print('开启!')
game(*args, **kwargs)
print('关闭!')
return inner
# @guanjia
# def playLOL(username,pwd):
# print('欢迎来到英雌联盟!',' 用户名:'+username,' 密码:'+pwd)
#
# @guanjia
# def playPSGame(username,pwd,gamename):
# print('PS游戏开启!',' 用户名:'+username,' 密码:'+pwd,' 游戏名称:'+gamename)
# playLOL('xiayong','moore123')
# playPSGame('xiayong','moore123',gamename='刀剑神域')
# end--------2,wrapper的参数使用----------------------
# start--------3,wrapper的返回值使用----------------------
'''
功能
设置一个管家,使其帮助玩家自动实现开关
动态传参
a. *args 接受所有位置参数并存入元组
b. **args 接受所有关键字参数并存入字典
'''
def guanjia(game):
def inner(*args, **kwargs):
print('开启!')
result = game(*args, **kwargs)
print('关闭!')
return result
return inner
@guanjia
def playLOL(username, pwd):
print('欢迎来到英雌联盟!', ' 用户名:' + username, ' 密码:' + pwd)
return '给你奖励一个皮肤'
@guanjia
def playPSGame(username, pwd, gamename):
print('PS游戏开启!', ' 用户名:' + username, ' 密码:' + pwd, ' 游戏名称:' + gamename)
return '给你奖励一件神器'
# resultLOL = playLOL('xiayong','moore123')
# print(resultLOL)
# resultPSGame = playPSGame('xiayong','moore123',gamename='刀剑神域')
# print(resultPSGame)
# end--------3,wrapper的返回值使用----------------------
# start--------4,一个函数携带多个wrapper----------------------
'''
功能
设置一个管家,使其帮助玩家自动实现开关
动态传参
a. *args 接受所有位置参数并存入元组
b. **args 接受所有关键字参数并存入字典
'''
def wrapper1(fn):
def inner(*args, **kwargs):
print('wrapper1 IN')
ret = fn(*args, **kwargs)
print('wrapper1 OUT')
return ret
return inner
def wrapper2(fn):
def inner(*args, **kwargs):
print('wrapper2 IN')
ret = fn(*args, **kwargs)
print('wrapper2 OUT')
return ret
return inner
@wrapper1 # wrapper1.inner(#wrapper2.inner)
@wrapper2 # wrapper2.inner
def playPSGame(username, pwd, gamename):
print('PS游戏开启!', ' 用户名:' + username, ' 密码:' + pwd, ' 游戏名称:' + gamename)
return '给你奖励一件神器'
# resultPSGame = playPSGame('xiayong','moore123',gamename='刀剑神域')
# print(resultPSGame)
'''
wrapper1 IN
wrapper2 IN
PS游戏开启! 用户名:xiayong 密码:moore123 游戏名称:刀剑神域
wrapper2 OUT
wrapper1 OUT
给你奖励一件神器
'''
# end--------4,一个函数携带多个wrapper----------------------
# start--------5,demo----------------------
'''
功能
设置一个装饰器,在用户执行数据处理操作前,需要一次登录验证
'''
loginStatus = False
def login_verify(fn):
def inner(*args, **kwargs):
global loginStatus
if loginStatus == True:
print('登录状态中,请求正在处理!')
else:
while 1:
userName = input('请输入用户账号>>>')
userPwd = input('请输入密码>>>')
if userName == 'admin' and userPwd == '123':
loginStatus = True
print('登录成功!正在处理请求!')
break
else:
print('录入用户信息错误!请重新登录!')
ret = fn(*args, **kwargs)
return ret
return inner
@login_verify
def userAdd():
print('新增处理!!!')
@login_verify
def userUpdate():
print('更新处理!!!')
@login_verify
def userDelete():
print('删除处理!!!')
userAdd()
userUpdate()
userDelete()
''' 执行结果
请输入用户账号>>>1
请输入密码>>>1
录入用户信息错误!请重新登录!
请输入用户账号>>>admin
请输入密码>>>123
登录成功!正在处理请求!
新增处理!!!
登录状态中,请求正在处理!
更新处理!!!
登录状态中,请求正在处理!
删除处理!!!
'''
# end--------4,demo----------------------