函数之装饰器
装饰器
1,开放封闭原则
- 定义:对修改封闭,对扩展开放
2,装饰器
-
作用:在不修改源码及函数调用方式的前提下对函数进行扩展-
-
def wrappee(f): #f被装饰的函数名 def innner(*args,**kwargs): 装饰之前的操作 f(*args,**kwargs) 装饰之后的操作 return 装饰之后的返回值 return inner @wrapper ###想当于:func=wrapper(func) def func(*args,**kwargs): print(f'xxx{args}xxx') return func('要传的实参')
-
@wrapper:语法糖
有参装饰器
-
在装饰器的基础上再套上一层
-
login_dic = { "username": None, "flag": False } # 正确的案例 msg = """ QQ 微信 邮箱 """ chose = input(msg).upper() def auth(argv): def wrapper(func): def inner(*args,**kwargs): if login_dic["flag"]: func(*args,**kwargs) else: if argv == "QQ": print("欢迎登陆QQ") user = input("username:") pwd = input("password:") if user == "alex" and pwd == "alex123": # qq login_dic["flag"] = True login_dic["username"] = user func(*args,**kwargs) else: print("用户名或密码错误!") elif argv == "微信": print("欢迎登陆微信") user = input("username:") pwd = input("password:") if user == "1351101501" and pwd == "alex": # 微信 login_dic["flag"] = True login_dic["username"] = user func(*args, **kwargs) else: print("用户名或密码错误!") return inner return wrapper @auth("QQ") def foo(): print("这是一个被装饰的函数") # wrapper = auth(chose) # foo = wrapper(foo) foo() """ # @auth(chose) 相等于以下两行代码的解构 # wrapper = auth(chose) # foo = wrapper(foo) """
多装一装饰器
-
多个装饰器装饰一个函数
-
先执行离被装饰的函数最近的语法糖
-
小技巧:进入装饰器从上往下,走到最后一个装饰器执行被装饰的函数,退出装饰从下往上走
-
# def wrapper1(func): # def inner1(*args,**kwargs): # print(1) # func(*args,**kwargs) # print(11) # return inner1 # # def wrapper2(func): # func == foo # def inner2(*args,**kwargs): # func(*args, **kwargs) # print(22) # return inner2 # # def wrapper3(func): # def inner3(*args,**kwargs): # print(3) # func(*args, **kwargs) # print(33) # return inner3 # @wrapper1 # 1 11 # @wrapper3 # 3 33 # @wrapper2 # 8 22 # def foo(): # print(8)
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华