假设我们有一个递归函数的装饰器:
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
属性不会被更改) .我可以在装饰器中以某种方式实现它吗?
答案 0 :(得分:0)
这对于装饰器是不可能的。它们旨在完全接管 func
的实现,以便所有调用都通过包装器。
您需要的是,第一个调用重新初始化 .a
属性,这听起来像是您想要某种转发:
def fwd_func(*args, **kwargs):
func.a = 0
...
res = func(*args, **kwargs)
...
return res
现在,只有顶级调用者应该调用 fwd_func(...)
而不是 func(...)
。