装饰器
开闭原则:
对功能的扩展开放
对代码的修改是封闭
通用装饰器语法:
def wrapper(fn):
def inner(*args, **kwargs): # 聚合
在目标函数之前
ret = fn(*arg, **kwargs) # 打散
在目标函数之后
return ret
return inner
@wrapper
def func():
pass
func()
带参数的装饰器
def wrapper_out(参数):
def wrapper(fn):
def inner(*args, **kwargs): # 聚合
在目标函数之前
ret = fn(*arg, **kwargs) # 打散
在目标函数之后
return ret
return inner
return wrapper
@wrapper_out(实参) # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
def func():
pass
多个装饰器装饰同一个函数
# 就近原则
@wrapper1
@wrapper2
@wrapper3
def func():
print("我是可怜的func")
func()
# 1 2 3 func 3 2 1
装饰器的应用
menu = ("查看", "添加", "修改", "删除", "退出")
flag = False # 没登录
def login():
global flag
username = input("请输入用户名:")
password = input("请输入密码:")
if username == "alex" and password == "123":
flag = True
print("登录")
else:
flag = False
print("用户名密码错误")
# 登录验证装饰器
def login_verify(fn):
def inner(*args, **kwargs):
# 登录校验
while 1:
if flag == True:
ret = fn(*args, **kwargs)
return ret
else:
print('对不起, 您还没有登录')
login()
return inner
def chakan():
print("==============================查看")
@login_verify
def tianjia():
print("============================添加")
@login_verify
def xiugai():
print("=======================修改")
@login_verify
def shanchu():
print("=========================删除")
while 1:
for i in range(len(menu)):
print(i+1, menu[i])
num = input("请输入你要执行的菜单:")
if num == "1":
chakan()
elif num == "2":
tianjia()
elif num == "3":
xiugai()
elif num == "4":
shanchu()
elif num == "5":
print("程序退出中..........")
exit()
else:
print("输入有误. 请重新选择!")