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()