装饰器函数02

♀尐吖头ヾ 提交于 2019-12-04 09:10:58
  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()

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!