装饰器
开闭原则:
对功能的扩展开放
对代码的修改是封闭
通用装饰器语法: 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("输入有误. 请重新选择!")