装饰器

装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象。

简单的装饰器

 import time

 def show_time(f):
def inner():
start = time.time()
f()
end = time.time()
print('time: %s'%(end-start))
return inner @show_time
def fun1():
print('hello')
time.sleep(1) fun1()
#输出
#hello
#time: 1.000274896621704

其中@show_time的意思是 fun1 = showtime(fun1) ,作用是在执行原函数add()时,把执行的代码转为inner()函数中的代码。

带参数的被装饰函数

如果被装饰的函数带有参数则装饰函数要带上参数。

参数个数确定时:

 import time

 def show_time(f):
def inner(a,b):
start = time.time()
f(a,b)
end = time.time()
print('time: %s'%(end-start))
return inner @show_time
def fun1(x,y):
print(x+y)
time.sleep(1) fun1(1,2)
#输出
#3
#time: 1.0007870197296143

参数个数不确定时:

 import time

 def show_time(f):
def inner(*args,**kwargs):
start = time.time()
f(*args,**kwargs)
end = time.time()
print('time: %s'%(end-start))
return inner @show_time
def fun1(*args,**kwargs):
sum = 0
for i in args:
sum+=i
print(sum)
time.sleep(1) 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能够发现这一层的封装,并把参数传递到装饰器的环境中。

05-02 15:03
查看更多