python之装饰器
一.定义:在不破坏原有函数和原有函数调用的基础上. 给函数添加新的功能
def wrapper(fn):
def inner(*args, **kwargs): # 聚合
在目标函数之前
ret = fn(*arg, **kwargs) # 打散
在目标函数之后
return ret
return inner
@wrapper
def func():
pass
func()
二. 同一个函数被多个装饰器装饰(举例说明)
def wrapper1(fn): def inner(*args, **kwargs): print("1111111") ret = fn(*args, **kwargs) print("2222222") return ret return inner def wrapper2(fn): def inner(*args, **kwargs): print("3333333") ret = fn(*args, **kwargs) print("44444444") 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") func() # 1 2 3 func 3 2 1
三. 带参数的装饰器
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
# def wrapper_out(flag): # 装饰器本身的参数 # def wrapper(fn): # 目标函数 # def inner(*args, **kwargs): # 目标函数执行需要的参数 # if flag == True: # ret = fn(*args, **kwargs) # 在执行目标函数之前 # return ret # else: # ret = fn(*args, **kwargs) # 在执行目标函数之前 # return ret # return inner # return wrapper # # # # 语法糖 @装饰器 # @wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器 再和@拼接 @装饰器 # def func(): # 被 wrapper装饰 # print("啦啦啦") # #func()
四.装饰器的应用
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("输入有误. 请重新选择!")