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() 方法,实现原来的功能,并且增加新的功能,前提不能修改源代码。

 

posted @ 2018-02-02 19:33  短毛兔  阅读(260)  评论(0编辑  收藏  举报