装饰器是什么?他有什么特点?
装饰器就是对被装饰的对象(函数、类)进行重构的,其可以在不改变原来对象的情况下调用对象时执行重构后的行为
特点:
1.修饰器本质上也是一个函数,
2.只不过这个函数接收其他函数作为参数
3.并对其进行一定的改造之后返回新函数
上实例:问:
定义一种方案,能在一个函数执行前输出hello,执行后输出byebye,并统计函数运行的时间?
def sayhello( func ): #func参数即为被装饰的对象(这里为a函数)
def wrapper(*args,**kwargs): #里面的参数为被装饰对象的参数(这里为:num)
print("***hello***")
return func(*args,**kwargs) #返回执行a函数
return wrapper #执行 wrapper()函数
def saybye(func):
def wrapper(*args,**kwargs):
#又开始执行a函数,但会发现还有一个rate装饰器,于是开始执行rate函数
func(*args,**kwargs)
print("***bye bye***")
return wrapper
def rate(func):
def wrapper(*args,**kwargs):
import datetime
start=datetime.datetime.now()
func(*args,**kwargs) #执行到这,装饰器都调用完了所以开始执行a函数,继续往下
end=datetime.datetime.now()
print("***程序运行时间:"+str(end-start))
return wrapper
@sayhello #使用 @+装饰器名 的形式给 a函数装饰一个sayhello装饰器,以下一样。
@saybye #一个函数被装载多个装饰器,按从上到下的顺序执行。
@rate
def a(num):
nums=0
for i in range(num):
nums+=i
print(nums)
a(100000) #当a函数被调用时,发现有装饰器,先执行装饰器即开始会执行sayhello装饰器
执行过程:
当a函数被调用时,发现a函数上面有三个装饰器:@sayhello ,@saybye ,@rate,于是找到第一个装饰器即sayhello并开始先执行它,此时,sayhello里的func参数即为a函数,执行sayhello函数,会返回一个wrapper对象,然后开始运行wrapper函数,里面的参数即为传入a函数的参数,执行wrapper里的代码后return func(*args,**kwargs),即开始执行a函数,发现a函数上还有装饰器,然后从上往下继续调用装饰器。
运行效果: