装饰器带参数时是三层函数嵌套:第一层接收装饰器参数并返回第二层,第二层接收被装饰函数并返回第三层,第三层接收调用参数并执行逻辑;缺一不可,否则报错或失效。
装饰器带参数时,本质是“三层函数嵌套”:最外层接收装饰器参数,中间层接收被装饰函数,最内层接收函数调用时的参数。关键在于理清每一层的职责和返回时机。
这一层函数(常叫decorator_factory)在@语法执行时被立即调用,传入的是你写在@后面括号里的值,比如@retry(max_times=3)中的max_times=3。它不接触被装饰函数,只负责“配置”后续行为。
**kwargs增强灵活性这一层(常叫decorator)在Python加载函数定义时被调用,接收的是原函数对象(如def fetch_data(): ...)。它的任务是返回一个新函数,替代原函数被调用。
functools.wraps(func))这一层(常叫wrapper)在运行时被触发,接收原函数调用时的所有参数(*args, **kwargs)。它是真正插入逻辑(如计时、校验、重试)的位置,也必须把参数原样或修改后传给原函数。
*args, **kwargs接收并透传,确保兼容任意签名当装饰器参数多、逻辑复杂或需维护状态(如累计调用次数、共享缓存字典),用类替代闭包更易读可控。类的__init__对应第一层,__call__对应第二层,而wrapper逻辑可单独抽成方法。
__init__(self, max_times=1, delay=0):存装饰器参数__call__(self, func):返回包装函数,同时保存self.func = func
_execute_with_ret
ry(self, *args, **kwargs):专注核心逻辑,解耦清晰不复杂但容易忽略:三层返回缺一不可,漏掉任一层都会导致TypeError: 'function' object is not callable或装饰失效。写完可快速验证:@my_dec(arg=1)是否能正常修饰函数,且修饰后函数仍可带参调用。