内容回顾:
1. 函数可以做为参数进行传递
2. 函数可以作为返回值进行返回
3. 函数名称可以当成变量一样进行赋值操作
装饰器: -> 要求记住最后的结论
装饰器本质上是一个闭包
作用:
在不改变原有函数调用的情况下,给函数增加新的功能:
直白:可以在函数前后添加新功能,但是不改原来的代码
在用户登录的地方,日志。
通用装饰器的写法:
def wrapper(fn): wrapper:装饰器, fn:目标函数
def inner(*args,**kwargs):
# 在目标函数执行之前.......
ret = fn(*args,**kwargs) # 执行目标函数
# 在目标函数执行之后......
return ret
return inner # 注意的是没有加括号,不然会把函数给执行了 坑!
# 把内存函数给返回 #()是把内存函数执行的结果给返回了
@wrapper
def target():
pass
target() # => inner()
一个函数可以被多个装饰器装饰:
@wrapper1
@wrapper2
def target():
规则和规律 wrapper1 wrapper2 target wrapper2 wrapper1
#案例
# 1
# def func():
# print('我是函数')
#
# def gggg(fn): # fn要求是个函数
# fn() # func()
#
# gggg(func)
# def func():
# def inner():
# print("123")
# return inner
#
# ret = func()
# ret()
# def func1():
# print("我是函数1")
#
# def func2():
# print("我是函数2")
#
# func1 = func2
#
# func1()
# def guanjia(game):
# def inner():
# print("打开外挂")
# game() # 玩起来了
# print("关闭外挂")
# return inner
#
#
# @guanjia # 相当于 play_dnf = guanjia(play_dnf)
# def paly_dnf():
# print("你好啊,我叫赛利亚,今天又是美好的一天")
#
# @guanjia # 相当于 play_lol = guanjia(play_lol)
# def play_lol():
# print("德玛西亚!!!!!!")
#
#
# paly_dnf() # 此时运行的是管家给的内层函数inner
# play_lol()
# paly_dnf = guanjia(paly_dnf) # 让管家把游戏重新封装一遍,我这边把原来的游戏替换了
# play_lol = guanjia(play_lol) # 让管家把lol也重新封装一下
#
# paly_dnf() # 重复输出
# paly_dnf()
# paly_dnf()
# paly_dnf()
# paly_dnf()
# paly_dnf()
# paly_dnf()
# print("开挂")
# paly_dnf()
# print("关闭外挂")
#
#
#
#
# print("开挂")
# play_lol()
# print("关闭外挂")
# 2
# def guanjia(game):
# # * ,**表示接收所有参数,打包成元组和字典
# def inner(*args, **kwargs): # inner 添加了参数,args一定是一个元组 kwargs 一定是字典 ('admin' , ‘)
# print("打开外挂")
# # * , ** 表示把argss元组和kwargs 字典打散成 位置参数以及关键字参数传递进去
# game(*args, **kwargs) # 玩起来了 # game('admin' ,'123456')
# print("关闭外挂")
# return inner
#
# @guanjia # play_dnf = guanjia(play_dnf)
# def paly_dnf(username, password):
# print("我要开始玩儿dnf", username, password)
# print("你好啊,我叫赛利亚,今天又是美好的一天")
#
#
#
# @guanjia # play_lol = guanjia(play_lol)
# def play_lol(username , password,hero):
# print("我要开始玩儿lol", username, password, hero)
# print("德玛西亚!!!!!!")
#
#
# paly_dnf("admin", "123456")
# play_lol("admin", "1234567", "剑圣")
# 3
# def guanjia(game):
# def inner(*args, **kwargs):
# print("打开外挂")
# ret = game(*args, **kwargs) # 这里是目标函数的执行 ,这里是能够拿到从目标函数返回的返回值的。
# print("关闭外挂")
# return ret
# return inner
#
# @guanjia
# def paly_dnf(username, password):
# print("我要开始玩儿dnf", username, password)
# print("你好啊,我叫赛利亚,今天又是美好的一天")
# return "一把屠龙刀"
#
#
# def play_lol(username , password,hero):
# print("我要开始玩儿lol", username, password, hero)
# print("德玛西亚!!!!!!")
#
#
# ret = paly_dnf("admin", "123456") # inner
# print(ret)
#
#
# # play_lol("admin", "1234567", "剑圣")
# 4
#综合案例篇
# 1
# def wrapper1(fn): # fn: wraaper2.inner
# def inner(*arg,**kwargs):
# print("这里是wrapper1 进入") # 1 wrapper2.inner
# ret = fn(*arg,**kwargs)
# print("这里是wrapper1 出去") # 5
# return ret
# return inner
#
# # 2
#
# def wrapper2(fn): # fn: target
# def inner(*arg,**kwargs):
# print("这里是wrapper2 进入") # 2
# ret = fn(*arg,**kwargs) # target
# print("这里是wrapper2 出去") # 4
# return ret
# return inner
#
#
# @wrapper1 # target = wrapper1(wrapper2.inner) => target: wrapp1.inner
# @wrapper2 # target = wrapper2(target) => target:wrapper2.inner
# def target():
# print("我的目标") # 3
#
# target()
# wrapper1 wrapper2 target wrapper2 wrapper1
"""
这里是wrapper1 进入
这里是wrapper2 进入
我的目标
这里是wrapper2 出去
这里是wrapper1 出去
"""
login_flag = False
def login_verify(fn):
def inner(*args,**kwargs):
# 这里完成登录校验
global login_flag
if login_flag == False:
print("还未完成用户登录操作")
while 1:
username = input(">>>")
password = input(">>>")
if username =="admin" and password =="123":
print("登录成功")
login_flag = True
break
else:
print("登录失败,用户名或密码错误")
ret = fn(*args,**kwargs)
return inner
@login_verify
def add():
print("添加员工信息")
@login_verify
def delete():
print("删除信息")
@login_verify
def upd():
print("修改信息")
@login_verify
def search():
print("查询员工信息")
add()
delete()
upd()
search()