"""
通用装饰器的写法:
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():
print('我是目标函数')
结果 wrapper1 wrapper2 TARGET wrapper2 wrapper1
"""
# 例子1
def guanjia(game):
# *,** 表示接收所有参数,打包成元组和字典
def inner(*args, **kwargs): # inner添加了参数,args元组,kwargs字典
print("打开外挂")
# *,** 表示把args元组和kwargs字典打散成位置参数以及关键字参数传递进去
game(*args, **kwargs)
print("关闭外挂")
return inner
@guanjia
def play_dnf(username, password):
print("开始玩dnf", username, password)
@guanjia
def play_lol(username, password, hero):
print("开始玩lol", username, password, hero)
play_dnf("admin", "123456")
play_lol("admin", "123456", "xxx")
# 多个wrapper例子
def wrapper1(fn): # fn: wrapper2.inner
def inner(*args, **kwargs):
print("这是wrapper1 进入")
ret = fn(*args, **kwargs) # wrapper2.inner
print("这是wrapper1 出去")
return ret
return inner
def wrapper2(fn): # fn: target
def inner(*args, **kwargs):
print("这是wrapper2 进入")
ret = fn(*args, **kwargs) # target
print("这是wrapper2 出去")
return ret
return inner
@wrapper1 # target = wrapper1(wrapper2.inner) => target: wrapper1.inner
@wrapper2 # target = wrapper2(target) => target: wrapper2.inner
def target():
print("我是目标")
target() # 结果 wrapper1 wrapper2 TARGET wrapper2 wrapper1
# 登录后增删改查例子
login_flag = False
def login_verify(fn):
def inner(*args, **kwargs):
global login_flag
if login_flag == False:
# 这里做登陆校验
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_verify
def add():
print("增加信息")
@login_verify
def del():
print("删除信息")
@login_verify
def update():
print("修改信息")
@login_verify
def search():
print("查询信息")
add()
Python装饰器实例
于 2024-05-30 22:23:58 首次发布