从零开始的Python学习Episode 11——装饰器
装饰器
装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象。
简单的装饰器
1 import time 2 3 def show_time(f): 4 def inner(): 5 start = time.time() 6 f() 7 end = time.time() 8 print('time: %s'%(end-start)) 9 return inner 10 11 @show_time 12 def fun1(): 13 print('hello') 14 time.sleep(1) 15 16 fun1()
#输出
#hello
#time: 1.000274896621704
其中@show_time的意思是 fun1 = showtime(fun1) ,作用是在执行原函数add()时,把执行的代码转为inner()函数中的代码。
带参数的被装饰函数
如果被装饰的函数带有参数则装饰函数要带上参数。
参数个数确定时:
1 import time 2 3 def show_time(f): 4 def inner(a,b): 5 start = time.time() 6 f(a,b) 7 end = time.time() 8 print('time: %s'%(end-start)) 9 return inner 10 11 @show_time 12 def fun1(x,y): 13 print(x+y) 14 time.sleep(1) 15 16 fun1(1,2)
#输出
#3
#time: 1.0007870197296143
参数个数不确定时:
1 import time 2 3 def show_time(f): 4 def inner(*args,**kwargs): 5 start = time.time() 6 f(*args,**kwargs) 7 end = time.time() 8 print('time: %s'%(end-start)) 9 return inner 10 11 @show_time 12 def fun1(*args,**kwargs): 13 sum = 0 14 for i in args: 15 sum+=i 16 print(sum) 17 time.sleep(1) 18 19 fun1(1,2,3,4,5)
#输出
#15
#time: 1.0009024143218994
带参数的装饰器
import time def judge(flag = 'False'): def show_time(f): def inner(*args,**kwargs): if flag == 'True': start = time.time() f(*args,**kwargs) end = time.time() print('time: %s'%(end-start)) else: f(*args, **kwargs) return inner return show_time @judge('True') def add(*args,**kwargs): sum = 0 for i in args: sum+=i print(sum) time.sleep(1) @judge() def multiple(*args,**kwargs): sum = args[0] for i in args: sum*=i print(sum) time.sleep(1) add(1,2,3,4,5) multiple(1,2,3,4,5)
#输出
#15
#time: 1.0006871223449707
#120
装饰器的语法允许我们在调用时,提供其它参数,比如当@judge()参数为默认的False时,不输出消耗时间了,当@judge()参数为True时,输出了消耗时间。这样实际上是在原有的装饰器上再加了一层,当我 们使用@judge(‘True’)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。