"""
回顾函数:
1. 函数可以作为参数进行传递
2. 函数可以作为返回值进行返回
3. 函数名称可以当作变量进行赋值操作
装饰器:
1. 本质是一个闭包
2. 作用:
在不改变原有函数调用的情况下,给函数增加新的功能
即:可以在函数前后添加新功能,但不改变原来的代码
3. 通用装饰器写法:
def wrapper(fn): wrapper:装饰器,fn:目标函数
def inner(*args, **kwargs):
#在目标函数执行之前。。。
fn(*args, **kwargs) #执行目标函数
#在目标函数执行之后。。。
return ret
return inner #此处不可以加()
@wrapper
def target():
pass
target() # => inner()
4. 一个函数可以被多个装饰器装饰
@wrapper1 #target = wrapper(wrapper2.inner) => target:wrapper1.inner
@wrapper2 #target = wrapper2(target) => target:wrapper2.inner
def target():
print("我是目标函数")
target()
规则:wrapper1 warpper1 target wrapper2 wrapper1
5. 实战
"""
'''
#eg1 函数可以作为参数进行传递
def func():
print('我是函数')
def func2(fn): #fn要求是个函数
fn() # func()
func2(func)
#打印:我是函数
#eg2 函数可以作为返回值进行返回
def func():
def inner():
print("123")
return inner
ret = func()
ret()
#打印:123
#eg3 函数名称可以当作变量进行赋值操作
def func1():
print('我是函数1')
def func2():
print('我是函数2')
func1 = func2
func1()
#打印:我是函数2
'''
"""
#-----------------------------eg4 装饰器-----------------------------
def guanjia(game):
def inner():
print("打开外挂")
game()
print("关闭外挂")
return inner
@guanjia #相当于 play_dnf = guanjia(play_dnf)
def play_dnf():
print("你好,在玩dnf!")
@guanjia
def play_lol():
print("你好,在玩lol!")
play_dnf() #此时运行的是guanjia给的内层函数inner
'''
打印:
打开外挂
你好,在玩dnf!
关闭外挂
'''
play_lol()
'''
打印:
打开外挂
你好,在玩lol!
关闭外挂
'''
"""
"""
#-----------------------------eg5 装饰器 -- 传参数-----------------------------
def guanjia(game):
# 这里的* 表示接受所有参数,打包为元组和字典
def inner(*args, **kwargs):
print("打开外挂")
# *, ** 表示把args元组和kwargs字典打散成位置参数以及关键字参数传递进去
game(*args, **kwargs)
print("关闭外挂")
return inner
@guanjia #相当于 play_dnf = guanjia(play_dnf)
def play_dnf(uasername, password):
print("你好,在玩dnf!")
@guanjia
def play_lol(uasername, password, hero):
print("你好,在玩lol!")
play_dnf("admin", "123456")
play_lol("admin", "123456", "鲁班")
"""
"""
#-----------------------------eg6 装饰器 -- 返回值-----------------------------
def guanjia(game):
def inner(*args, **kwargs):
print("打开外挂")
ret = game(*args, **kwargs) #目标函数的执行,可以拿到目标函数的返回值
print("关闭外挂")
return ret
return inner
@guanjia
def play_dnf(uasername, password):
print("你好,在玩dnf!")
return "一把屠龙刀"
def play_lol(uasername, password, hero):
print("你好,在玩lol!")
ret = play_dnf("admin", "123456")
print(ret)
"""
"""
#-----------------------------eg7 装饰器 -- 一个函数被多个装饰器装饰-----------------------------
def wrapper1(fn): #fn wrapper2.inner
def inner(*args, **kwargs):
print("这里是wrapper1 进入")
ret = fn(*args, **kwargs)
print("这里是wrapper1 出去")
return ret
return inner
def wrapper2(fn): #fn:target
def inner(*args, **kwargs):
print("这里是wrapper2 进入")
ret = fn(*args, **kwargs)
print("这里是wrapper2 出去")
return ret
return inner
@wrapper1 #target = wrapper(wrapper2.inner) => target:wrapper1.inner
@wrapper2 #target = wrapper2(target) => target:wrapper2.inner
def target():
print("我是目标函数")
target()
'''
打印:
这里是wrapper1 进入
这里是wrapper2 进入
我是目标函数
这里是wrapper2 出去
这里是wrapper1 出去
'''
"""
#-----------------------------eg8 装饰器 -- 实战-----------------------------
login_flag = False
def login_verffy(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 ret
return inner
@login_verffy
def add():
print("添加信息")
@login_verffy
def delete():
print("删除信息")
add()
delete()
python3学习之路 -- 4.8)装饰器
最新推荐文章于 2024-03-22 14:36:50 发布