day 15 装饰器
关于函数的装饰器
1.装饰器
1.1装饰器的作用?
不改变函数的功能和调用方式的情况下添加新的功能
装饰器遵守开放封闭原则:
对功能的扩展开放
对代码的修改是封闭
1.2装饰器语法:
函数版:
def wrapper(fn): def inner(*args, **kwargs): # 聚合 在目标函数之前 #可自定义任何语法 ret = fn(*arg, **kwargs) # 打散 在目标函数之后 #可定义任何语法 return ret return inner
语法糖版:
@wrapper def func(): pass func()
2.带有参数的装饰器
def wrapper_out(flag): def wrapper(fn): def inner(*args,**kwargs): if flag == True: ret = fn(*args, **kwargs) return ret else: print("问问金老板行情怎么样?") ret = fn(*args, **kwargs) print("金老板骗人!") return ret return inner return wrapper @wrapper_out(False) def yue(): print("走啊,约起!") yue()
3.多个装饰器装饰同一个函数
#先定义多个装饰器 def wrapper1(fn): def inner(*args,**kwargs): #打散 print("11111") ret = fn(*args,**kwargs) #聚合 print("22222") return ret return inner def wrapper2(fn): def inner(*args,**kwargs): #打散 print("333333") ret = fn(*args,**kwargs) #聚合 print("444444") return ret return inner def wrapper3(fn): def inner(*args,**kwargs): #打散 print("555555") ret = fn(*args,**kwargs) #聚合 print("666666") return ret return inner #定义被装饰的函数 @wrapper1 @wrapper2 @wrapper3 def func(): print("我是被装饰的函数") func() ####结果##### 11111 333333 555555 我是被装饰的函数 666666 444444 22222 #就近原则,会依次从下到上的去执行装饰器
4.装饰器的应用
登录校验
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("输入有误. 请重新选择!")