1 #装饰器 2 #1.简单的装饰器 3 #2.有返回值的装饰器 4 #3.被装饰函数带参数的装饰器 5 #4.被装饰函数带有多个不同个数参数的装饰器 6 #5.装饰器函数带参数 7 #6.多个装饰器装饰同一个函数 8 #装饰器的作用 9 #不修改函数调用方式 但是在原来的函数前后添加功能 10 #原则:开放封闭原则 11 #开放:对扩展是开放的 12 #封闭:对修改是封闭 13 #装饰器的固定模式 14 15 #****************************************************************************** 16 import time 17 18 def timmer(f): 19 start = time.time() 20 f() 21 end = time.time() 22 print(end - start) 23 24 def func(): 25 time.sleep(0.01) 26 print('大家好') 27 28 timmer(func) 29 30 #****************************************************************************** 31 def func(): 32 time.sleep(0.01) 33 print('大家好') 34 35 def timmer(f): #装饰函数 36 def inner(): 37 38 start = time.time() 39 f() #被装饰的函数 40 end = time.time() 41 print(end - start) 42 return inner 43 44 func = timmer(func) 45 func() #调用func的时候实际调用的是timmer 46 47 48 #timmer 是一个装饰器函数,只对一个函数 有一些装饰作用 49 50 51 52 #************************************1.简单的装饰器****************************** 53 54 def timmer(f): #装饰函数 55 def inner(): 56 57 start = time.time() 58 f() #被装饰的函数 59 end = time.time() 60 print(end - start) 61 return inner 62 63 @timmer #语法糖 被装饰函数的函数名 64 def func(): 65 time.sleep(0.01) 66 print('大家好') 67 68 69 func() 70 71 #********************************2.有返回值的装饰器******************************* 72 #装饰带返回值函数的装饰器 73 74 def timmer(f): #装饰函数 75 def inner(): 76 77 start = time.time() 78 ret = f() #被装饰的函数 79 end = time.time() 80 print(end - start) 81 return ret 82 return inner 83 84 @timmer #语法糖 被装饰函数的函数名 85 def func(): 86 time.sleep(0.01) 87 print('大家好') 88 return '新年好' 89 90 91 func() 92 93 #*********************************3.被装饰函数带参数的装饰器*********************** 94 #装饰带参数函数的装饰器 95 96 def timmer(f): #装饰函数 97 def inner(a): 98 99 start = time.time() 100 ret = f(a) #被装饰的函数 101 end = time.time() 102 print(end - start) 103 return ret 104 return inner 105 106 @timmer #语法糖 被装饰函数的函数名 107 def func(a): 108 time.sleep(0.01) 109 print('大家好',a) 110 return '新年好' 111 112 113 ret = func(1) 114 115 #**************************4.被装饰函数带有多个不同个数参数的装饰器******************* 116 #装饰带参数个数不等多个函数的装饰器 117 118 def timmer(f): #装饰函数 119 def inner(*args,**kwargs): 120 121 start = time.time() 122 ret = f(*args,**kwargs) #被装饰的函数 123 end = time.time() 124 print(end - start) 125 return ret 126 return inner 127 128 @timmer #语法糖 被装饰函数的函数名 129 def func1(a): 130 time.sleep(0.01) 131 print('大家好',a) 132 return '新年好' 133 134 135 @timmer #语法糖 被装饰函数的函数名 136 def func2(a,b): 137 time.sleep(0.01) 138 print('大家好',a,b) 139 return '新年好' 140 141 ret1 = func1(1) 142 ret2 = func2(1,b=2) 143 print(func2.__name__) 144 145 #********************************装饰器固定格式********************************** 146 #装饰器固定格式 147 def wrapper(f): #装饰器函数 f是被装饰函数 148 def inner(*args,**kwargs): 149 #被装饰函数之前要做的事 150 ret = f(*args,**kwargs) #被装饰的函数 151 #被装饰函数之后要做的事 152 return ret 153 return inner 154 155 @wrapper 156 def func(a,b): 157 return a,b 158 ret = func(1,2) 159 160 #****************************************************************************** 161 #不影响外部调用被装饰函数发方法 给inner函数加一个装饰器 162 163 from functools import wraps 164 def wrapper(func): 165 @wraps(func) 166 def inner(*args,**kwargs): 167 #被装饰函数之前要做的事 168 ret = func(*args,**kwargs) #被装饰的函数 169 #被装饰函数之后要做的事 170 return ret 171 return inner 172 @wrapper 173 def holiday(day): 174 """这是放假通知""" 175 print("全体放假%s天"%day) 176 return "好开心" 177 178 print(holiday.__name__) 179 print(holiday.__doc__) 180 ret = holiday(3) 181 print(ret) 182 183 184 #装饰器进阶 185 #1.带参数的装饰器 186 #2.多个装饰器装饰一个函数 187 #-----------------------------5.带参数的装饰器------------------------------------- 188 FLAGE = True 189 def timmer_out(flag): 190 def timmer(func): #通过装饰器给内部传参 191 def inner(*args,**kwargs): 192 if flag: 193 start = time.time() 194 ret = func(*args,**kwargs) 195 end = time.time() 196 print(end - start) 197 return ret 198 else: 199 ret = func(*args,**kwargs) 200 return ret 201 return inner 202 return timmer 203 204 @timmer_out(FLAGE) 205 def wahaha(): 206 time.sleep(0.1) 207 print('wahahaha') 208 209 @timmer_out(FLAGE) 210 def erguotou(): 211 time.sleep(0.1) 212 print('erguotoutoutou') 213 wahaha() 214 erguotou() 215 216 #-----------------------------6.多个装饰器装饰一个函数------------------------------- 217 def wrapper1(func): 218 def inner1(): 219 print('wrapper1,before func') 220 func() 221 print('wrapper1,after func') 222 return inner1 223 224 def wrapper2(func): 225 def inner2(): 226 print('wrapper2,before func') 227 func() 228 print('wrapper2,after func') 229 return inner2 230 231 def wrapper3(func): 232 def inner3(): 233 print('wrapper3,before func') 234 func() 235 print('wrapper3,after func') 236 return inner3 237 238 @wrapper3 239 @wrapper2 240 @wrapper1 241 def f(): 242 print('inf') 243 244 f()
来源:https://www.cnblogs.com/zhengyinboke/p/11851826.html