装饰器的本质是一个函数,可解理成先组装出一个函数,然后调用。
【例】:
def dec1(func):
print("HHHA:0====>")
def one():
print("HHHA:0.1====>")
func()
print("HHHA:0.2====>")
return one
def dec2(func):
print("HHHB:0====>")
def two():
print("HHHB:0.1====>")
func()
print("HHHB:0.2====>")
return two
def dec3(func):
print("HHHC:0====>")
def three():
print("HHHC:0.1====>")
func()
print("HHHC:0.2====>")
return three
@dec1
@dec2
@dec3
def test():
print("HHHD:0====>test")
print("HHHH:0====>")
test()
输出:
HHHC:0====>
HHHB:0====>
HHHA:0====>
HHHH:0====>
HHHA:0.1====>
HHHB:0.1====>
HHHC:0.1====>
HHHD:0====>test
HHHC:0.2====>
HHHB:0.2====>
HHHA:0.2====>
请注意:以HHHH:0====>为界,前面为装饰,后面为调用。
【组装阶段】:
HHHC:0====>
HHHB:0====>
HHHA:0====>
可看出组装阶段是从下到上(即从最靠近被装饰的函数开始)。
【调用阶段】:
HHHA:0.1====>
HHHB:0.1====>
HHHC:0.1====>
HHHD:0====>test
HHHC:0.2====>
HHHB:0.2====>
HHHA:0.2====>
可看出执顺序是从外到内然后到外,等效于以下包含关系:
{
print("HHHA:0.1====>") //最外层
{
print("HHHB:0.1====>") //中间层
{
print("HHHC:0.1====>") //内层
{
test() //被装饰者
{
print("HHHD:0====>test")
}
}
print("HHHC:0.2====>")
}
print("HHHB:0.2====>")
}
print("HHHA:0.2====>")
}
被装饰的函数是一个妹子,装饰器是衣服。“办事情”的时候得依次把外套、衬衣、内衣脱掉,事情办完了还要依次把内衣、衬衣、外套穿上。距离“妹子”越近的装饰器代表越贴身的衣服。
扫描二维码关注公众号,回复:
3929673 查看本文章
【带参数的装饰器】:
如果修饰器本身需要传入参数, 比如,要自定义log的文本:
def log(text):
print("HHHA:0====>")
def decorator(func):
print("HHHA:0.1====>")
def wrapper(*args, **kw):
print("HHHA:0.1.1====>")
return func(*args, **kw)
print("HHHA:0.2====>")
return wrapper
print("HHHA:1====>")
return decorator
@log('execute')
def now():
print('HHHB:=====>test')
now()
输出:
HHHA:0====>
HHHA:1====>
HHHA:0.1====>
HHHA:0.2====>
HHHA:0.1.1====>
HHHB:=====>test