python3-多个装饰器的执行顺序

xiaoxiao2022-06-12  44

装饰器的本质是一个函数,可解理成先组装出一个函数,然后调用。


【例】: 

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====>") }

被装饰的函数是一个妹子,装饰器是衣服。“办事情”的时候得依次把外套、衬衣、内衣脱掉,事情办完了还要依次把内衣、衬衣、外套穿上。距离“妹子”越近的装饰器代表越贴身的衣服。

 

【带参数的装饰器】:

如果修饰器本身需要传入参数, 比如,要自定义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

 

转载请注明原文地址: https://www.6miu.com/read-4932190.html

最新回复(0)