递归装饰器重新初始化属性

时间:2021-04-06 15:43:29

标签: python python-decorators

假设我们有一个递归函数的装饰器:

def decorator(func):

    def wrapper(*args, **kwargs):
        ...
        res = func(*args, **kwargs)
        ...
        return res

    func.a = 0
    wrapper.a = 0
    return wrapper

我想每次在递归的第一步调用 .a 时都重新初始化 func 属性(所以当 func 调用自身时,.a 属性不会被更改) .我可以在装饰器中以某种方式实现它吗?

1 个答案:

答案 0 :(得分:0)

这对于装饰器是不可能的。它们旨在完全接管 func 的实现,以便所有调用都通过包装器。

您需要的是,第一个调用重新初始化 .a 属性,这听起来像是您想要某种转发:

def fwd_func(*args, **kwargs):
    func.a = 0
    ...
    res = func(*args, **kwargs)
    ...
    return res

现在,只有顶级调用者应该调用 fwd_func(...) 而不是 func(...)