回顾:
1函数可以作为参数进行传递:

上述等价于直接调用:func()
2.函数可以作为返回值返回

func()的返回值是函数ret
ret是内层函数
3.函数名称可以当成变量一样进行赋值操作。

装饰器
记住最后的结论:
装饰器本质上是一个闭包
作用:在不改变原有函数调用的情况下,给函数增加新的功能。
给函数添加新功能,但不改变原先的代码。 用处:用户登录,日志。
通用装饰器 def wrapper(fn): #wrapper 装饰器,fn:目标函数 def inner(*args,**args): # 在目标函数执行之前 ret = fn(*args,**args) #执行目标函数 return ret #返回值 return inner #千万不要加() @wrapper def target(): psaa target() # =>inner()#基本的原理 #进行封装 def game_help(game): def inner(): print("开始游戏") game() print("关闭游戏") return inner def play_csgo(): print("RUSH B") def play_lol(): print("且随疾风前行") #重新封装的游戏 play_csgo = game_help(play_csgo) play_lol = game_help(play_lol) play_lol() //terminal 开始游戏 且随疾风前行 关闭游戏
但是真正使用的时候,没必要写那么复杂,在每个前面添加一个@装饰器名
def game_help(game):
def inner():
print("开始游戏")
game()
print("关闭游戏")
return inner
@game_help
def play_csgo():
print("RUSH B")
@game_help
def play_lol():
print("且随疾风前行")
play_lol()
//terminal
开始游戏
且随疾风前行
关闭游戏
参数
增加位置参数和关键字参数,便于传递参数
def game_help(game):
def inner(*args,**kwargs):
print("开始游戏")
game(*args,**kwargs)
print("关闭游戏")
return inner
@game_help
def play_csgo():
print("RUSH B")
@game_help
def play_lol(admin,username):
print("且随疾风前行",admin,username) #传递参数
play_lol("亚索","追风")
实战:添加员工信息
login_flag = False #全局变量
def login_verify(fn):
def inner(*args,**kwargs):
global login_flag #引入全局变量
if login_flag == False: #保存登录状态,添加时不必重新登录
print("请登录")
#完成登录校验
while 1:
username = input(">>>username :")
password = input(">>>paaaword : ")
if username == "admin" and password == "123":
print("登录成功")
login_flag = True
break
else:
print("登录失败,密码或用户名错误")
ret = fn(*args,**kwargs) #后续的程序
return ret
return inner
@login_verify
def add():
print("添加员工信息")
@login_verify
def delete():
print("删除员工信息")
def upd():
print("修改员工信息")
def search():
print("查询员工信息")
add()
delete()
terminal//
请登录
>>>username :admin
>>>paaaword : 123
登录成功
添加员工信息
删除员工信息
17万+

被折叠的 条评论
为什么被折叠?



