day24
一、装饰器介绍
1 """ 2 1、什么是装饰器 3 装饰器是一个用来为被装饰者添加功能的工具 4 5 被装饰者:函数 6 装饰器:可以用函数实现装饰器这种工具 7 8 9 10 2、为何要用装饰器 11 为了在不修改被装饰器对象源代码以及调用方式的前提下 12 为被装饰对象添加上新功能 13 14 3、如何用装饰器 15 16 """ 17 # 被装饰对象 18 # import time 19 # 20 # def index(x): 21 # print('welcome to index page %s' % x) 22 # time.sleep(3) 23 # 24 # index(111) 25 26 27 # # 方案一:修改了源代码 28 # import time 29 # 30 # def index(x): 31 # start = time.time() 32 # print('welcome to index page %s' % x) 33 # time.sleep(3) 34 # stop = time.time() 35 # print(stop - start) 36 # 37 # index(111) 38 39 # # 方案二:没有修改被装饰对象的源代码与调用方式,但是有代码冗余问题 40 # import time 41 # 42 # def index(x): 43 # print('welcome to index page %s' % x) 44 # time.sleep(3) 45 # 46 # start = time.time() 47 # index(111) 48 # stop = time.time() 49 # print(stop - start) 50 # 51 # 52 # start = time.time() 53 # index(111) 54 # stop = time.time() 55 # print(stop - start) 56 # 57 # 58 # start = time.time() 59 # index(111) 60 # stop = time.time() 61 # print(stop - start) 62 63 64 # # 方案三:wrapper函数需要外部传入参数 65 # import time 66 # 67 # def index(x): 68 # print('welcome to index page %s' % x) 69 # time.sleep(3) 70 # 71 # def wrapper(): 72 # start = time.time() 73 # # inde(111) 74 # func(111) 75 # stop = time.time() 76 # print(stop - start) 77 # 78 # 79 # wrapper() 80 81 82 # # 方案四:调用方式改变了 83 # import time 84 # 85 # def index(x): 86 # print('welcome to index page %s' % x) 87 # time.sleep(3) 88 # 89 # def wrapper(func): 90 # start = time.time() 91 # func(111) 92 # stop = time.time() 93 # print(stop - start) 94 # 95 # 96 # wrapper(index) 97 98 99 # 方案五:闭包函数 100 # import time 101 # 102 # 103 # def index(x): 104 # print('welcome to index page %s' % x) 105 # time.sleep(3) 106 # 107 # 108 # # index(111) 109 # 110 # def outter(func): 111 # def wrapper(*args, **kwargs): 112 # start = time.time() 113 # func(*args, **kwargs) 114 # stop = time.time() 115 # print(stop - start) 116 # 117 # return wrapper 118 # 119 # 120 # index = outter(index) # index = wrapper的内存地址 121 # # print(f) 122 # index(111) # wrapper(111) 123 124 # 方案五:把wrapper伪装的跟被装饰对象一样 125 # import time 126 # 127 # 128 # def index(x): 129 # print('welcome to index page %s' % x) 130 # time.sleep(3) 131 # return 7777 132 # 133 # 134 # def outter(func): # func = 地址1 135 # def wrapper(*args, **kwargs): 136 # start = time.time() 137 # res = func(*args, **kwargs) 138 # stop = time.time() 139 # print(stop - start) 140 # return res 141 # return wrapper 142 # 143 # 144 # index = outter(index) # index = outter(地址1) # index -> 地址2 145 # 146 # res = index(111) # res = wrapper(111) 147 # print(res) 148 149 # 方案六:把wrapper伪装的跟被装饰对象一样,更进一步 150 import time 151 152 def index(x): 153 """ 154 这是index的帮助信息 155 """ 156 print('welcome to index page %s' % x) 157 time.sleep(3) 158 return 7777 159 160 161 def outter(func): # func = 地址1 162 def wrapper(*args, **kwargs): 163 start = time.time() 164 res = func(*args, **kwargs) 165 stop = time.time() 166 print(stop - start) 167 return res 168 wrapper.__doc__ = index.__doc__ 169 wrapper.__name__ = index.__name__ 170 171 return wrapper 172 173 174 index = outter(index) # index = outter(地址1) # index -> 地址2 175 176 # help(index)
二、无参装饰器
1 #无参函数的套用模板 2 3 import time 4 5 def outter(func): 6 def wrapper(*args,**kwargs): 7 res = func(*args,**kwargs) 8 return res 9 return wrapper 10 11 @outter 12 def index(x): 13 """ 14 这是index的帮助信息 15 """ 16 print('welcome to index page %s' % x) 17 time.sleep(3) 18 return 7777 19 20 index(111)
三、有参装饰器
1 def outter(engine = 'file'): 2 def deco2(func2): 3 def wrapper2(*args, **kwargs): 4 if engine == 'file': 5 inp_user = input('username>>>: ').strip() 6 inp_pwd = input('password>>>: ').strip() 7 if inp_user == 'egon' and inp_pwd == '123': 8 print("登录成功") 9 res2 = func2(*args, **kwargs) 10 return res2 11 else: 12 print("登录失败") 13 elif engine == "mysql": 14 print("基于mysql的认证") 15 elif engine == "ldap": 16 print("基于ladp的认证") 17 18 return wrapper2 19 return deco2 20 21 @outter(engine='ldap') # @deco2 # index=deco2(index) # index=wrapper2 22 def index(): 23 print('index功能') 24 25 # index = deco2(index,engine='mysql') 26 27 28 # index() # wrapper() 29 30 31 32 # 结论: 33 34 def outter(x,y): 35 def deco(func): 36 def wrapper(*args,**kwargs): 37 print(x,y) 38 res = func(*args,**kwargs) 39 return res 40 return wrapper 41 return deco 42 43 44 @outter(111,22) 45 def index(): 46 print('index') 47 48 index()
四、装饰器语法糖
1 import time 2 from functools import wraps 3 4 def outter(func): # func = 地址1 5 @wraps(func) 6 def wrapper(*args, **kwargs): 7 start = time.time() 8 res = func(*args, **kwargs) 9 stop = time.time() 10 print(stop - start) 11 return res 12 # wrapper.__doc__ = func.__doc__ 13 # wrapper.__name__ = func.__name__ 14 return wrapper 15 16 17 @outter # index = outter(index的内存地址) 18 def index(x): 19 """ 20 这是index的帮助信息 21 """ 22 print('welcome to index page %s' % x) 23 time.sleep(3) 24 return 7777 25 26 27 # res = index(111) 28 # print(res) 29 30 # help(index) 31 print(index)
五、叠加多个装饰器:加载顺序与执行顺序
1 # def deco1(func1): # func1 = wrapper2的内存地址 2 # def wrapper1(*args, **kwargs): 3 # print('===>运行wrapper1') 4 # res1 = func1(*args, **kwargs) 5 # return res1 6 # 7 # return wrapper1 8 # 9 # 10 # def deco2(func2): # func2 = wrapper3的内存地址 11 # def wrapper2(*args, **kwargs): 12 # print('===>运行wrapper2') 13 # res2 = func2(*args, **kwargs) 14 # return res2 15 # 16 # return wrapper2 17 # 18 # 19 # def deco3(func3): # func3 = index的内存地址 20 # def wrapper3(*args, **kwargs): 21 # print('===>运行wrapper3') 22 # res3 = func3(*args, **kwargs) 23 # return res3 24 # 25 # return wrapper3 26 # 27 # 28 # # index = wrapper1的内存地址 29 # @deco1 # deco1(wrapper2的内存地址) -> wrapper1的内存地址 30 # @deco2 # deco2(wrapper3的内存地址) -> wrapper2的内存地址 31 # @deco3 # deco3(index的内存地址) -> wrapper3的内存地址 32 # def index(): 33 # print('from index') 34 # return 123 35 # 36 # 37 # res = index() # wrapper1() 38 # print(res) 39 40 41 42 43 44 45 46 47 48 import time 49 50 def deco1(func1): # func1 = wrapper2的内存地址 51 def wrapper1(*args, **kwargs): 52 start = time.time() 53 res1 = func1(*args, **kwargs) 54 print(time.time() - start) 55 return res1 56 57 return wrapper1 58 59 60 def deco2(func2): # func2 = wrapper3的内存地址 61 def wrapper2(*args, **kwargs): 62 inp_user = input('username>>>: ').strip() 63 inp_pwd = input('password>>>: ').strip() 64 if inp_user == 'egon' and inp_pwd == '123': 65 print("登录成功") 66 res2 = func2(*args, **kwargs) 67 return res2 68 else: 69 print("登录失败") 70 return wrapper2 71 72 @deco1 73 @deco2 74 def index(): 75 print('index功能') 76 time.sleep(1) 77 78 index()

浙公网安备 33010602011771号