Python函数装饰器

 1 import time
 2  
 3  
 4 #装饰器函数
 5 def show_time(f):
 6     def inner():
 7         start = time.time()
 8         f()
 9         end = time.time()
10         print('spend %s'%(end-start))
11     return inner
12  
13  
14 #通过@show_time调用
15 @show_time
16 def bar():
17     print('bar...........')
18  
19 def foo():
20     print('foo...')
21  
22 foo()
23 # bar=show_time(bar)
24 bar()

装饰器类似与上面,先编写函数的功能模块

通过@showtime来完成函数的功能追加

@showtime作用其实就是调用上面的闭包函数show_time

 

 上面的函数都是不带参数的函数装饰器,那么如果调用的函数有参数,并且函数个数不确定呢,可以参考下面的例子:

 1 def show_time(f):
 2     def inner(*x,**y):
 3         start = time.time()
 4         f(*x,**y)
 5         end = time.time()
 6         print('spend %s'%(end-start))
 7     return inner
 8  
 9 @show_time
10 def add(*x,**y):
11     total=0
12     for temp in x:
13         total+=temp
14     print(total)
15  
16  
17 # foo()
18 # bar=show_time(bar)
19 bar()
20  
21 add(1,5,3,6,2,4)

如果装饰器中需要添加部分其他扩展的功能,可以给装饰器带上参数,如下:

 1 import time
 2  
 3 def logger(flag=''):
 4     def show_time(f):
 5         def inner(*x,**y):
 6             start = time.time()
 7             f(*x,**y)
 8             end = time.time()
 9             print('spend %s'%(end-start))
10             if flag == 'true':
11                 print('日志记录')
12         return inner
13     return show_time
14  
15 @logger('true')
16 def bar():
17     print('bar...........')
18  
19 @logger('true')
20 def add(*x,**y):
21     total=0
22     for temp in x:
23         total+=temp
24     print(total)
25  
26 @logger()
27 def foo():
28     print('foo...')
29 # foo()
30 # bar=show_time(bar)
31 #bar()
32  
33 add(1,5,3,6,2,4)
34 foo()

 

posted @ 2019-09-25 10:44  测试的世界很精彩  阅读(170)  评论(0编辑  收藏  举报