17_Python装饰器
一、什么是装饰器
目的:给func()方法,增加一个功能,在fun()执行期间,同时把fun()执行速率机算出来
1 import time 2 def func(): 3 print('嘻嘻哈哈') 4 5 6 start_time = time.time() 7 time.sleep(0.1) 8 func() 9 end_time = time.time() 10 print('----> 执行效率%s'%(end_time - start_time))
如果,我们给fun1,fun2,fun3,实现相同的功能呢?
1 def func(): 2 print('嘻嘻哈哈') 3 4 def timmer(f): 5 start_time = time.time() 6 time.sleep(0.1) 7 f() 8 end_time = time.time() 9 print('----> 执行效率%s'%(end_time - start_time)) 10 11 f = func 12 func = timmer 13 func(f)
但是,每次都需要将函数作为函数,传递给timmer(),而且这种方式已经破坏了原有的逻辑结构,之前的逻辑结构,是执行fun的同时,计算执行效率,但是现在是把fun传给第三方函数,进行计算。
怎么解决这种问题呢,装饰器。
装饰器就是:在不改动原函数代码前提下,增加额外的功能,装饰的返回值也是一个函数对象。
1 def func(): 2 print('嘻嘻哈哈') 3 4 5 def timmer(f): 6 start_time = time.time() 7 time.sleep(0.1) 8 f() 9 end_time = time.time() 10 print('----> 执行效率%s'%(end_time - start_time)) 11 return timmer 12 13 f = timmer(func) 14 f()
@语法糖 : 在定义函数的时候使用,避免再一次赋值操作。
代码修改如下:
1 def timmer(f): 2 start_time = time.time() 3 time.sleep(0.1) 4 f() 5 end_time = time.time() 6 print('----> 执行效率%s'%(end_time - start_time)) 7 return timmer 8 9 @timmer 10 def func(): 11 print('嘻嘻哈哈')
二、带参数的装饰器
1 import time 2 3 4 def wrapper(f): 5 def inner(*args,**kwargs): 6 start_time = time.time() 7 time.sleep(0.1) 8 f(*args,**kwargs) 9 end_time = time.time() 10 print('----> 执行效率%s' % (end_time - start_time)) 11 return inner 12 13 @wrapper 14 def fun(a): 15 print("%s嘻嘻哈哈" %(a)) 16 17 @wrapper 18 def fun1(a,b): 19 print('%s嘻嘻哈哈,%s也跟着嘻嘻哈哈' %(a,b))
三、带返回值的装饰器
1 def wrapper(f): 2 def inner(*args,**kwargs): 3 start_time = time.time() 4 time.sleep(0.1) 5 ret = f(*args,**kwargs) 6 end_time = time.time() 7 print('----> 执行效率%s' % (end_time - start_time)) 8 return ret 9 return inner 10 11 @wrapper 12 def fun(a): 13 s = "%s嘻嘻哈哈" %(a) 14 return s 15 16 print(name)
总结:就是 我们调用 fun() 方法,实现原来的功能,并且增加新的功能,前提不能修改源代码。