前言
上次我们讲解了装饰器的定义和使用,这节课我们再继续深入聊聊装饰器的那些事。
装饰器的嵌套
装饰器是可以嵌套的,当然我们关心的是嵌套的装饰器的执行顺序,例如下面这个案例:
@decorator1
@decorator2
@decorator3
def func():
pass
逆向传参,正向执行,所以是这样的:
decorator1(decorator2(decorator3(func)))
我们还是简单举个例子,加深我们的理解。
def decorator1(func):
def wrapper(*args,**kwargs):
print('first start')
func(*args,**kwargs)
print('first end')
return wrapper
def decorator2(func):
def wrapper(*args,**kwargs):
print('second start')
func(*args,**kwargs)
print('second end')
return wrapper
@decorator1
@decorator2
def func(message):
print(message)
func('hello world')
# first start
# second start
# hello world
# second end
# first end
类装饰器
之前我们的案例都是用函数作为装饰器,类也是可以做为装饰器的,这个主要是需要用到__call__。
每当类实例一次,__call__方法就调用一次。
class Decorate():
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print('start')
return self.func(*args, **kwargs)
@Decorate
def func(message):
print(message)
func('hello world')
# start
# hello world
案例
我们经常会去测试一些函数的执行时间,以便进行调试,这时我们就可以使用装饰器来实现这样的功能。
用以下代码,当想测试其他函数时,只需要在前面加上@log_time即可。
import time
def log_time(func):
def wrapper(*args,**kwargs):
t1 = time.time()
func(*args,**kwargs)
t2 = time.time()
print('{}'.format(t1-t2))
return wrapper
@log_time
def func(*args,**kwargs):
...
总结
本次我们讲解了嵌套装饰器以及类装饰器的使用,最后用一个简单的案例,加深你对于装饰器的理解。
网友评论