听起来几乎像是装饰工的教科书示例!
def counted(fn):
def wrapper(*args, **kwargs):
wrapper.called += 1
return fn(*args, **kwargs)
wrapper.called = 0
wrapper.__name__ = fn.__name__
return wrapper
@counted
def foo():
return
>>> foo()
>>> foo.called
1
您甚至可以使用另一个装饰器来自动记录一个函数在另一个函数中被调用多少次:
def counting(other):
def decorator(fn):
def wrapper(*args, **kwargs):
other.called = 0
try:
return fn(*args, **kwargs)
finally:
print '%s was called %i times' % (other.__name__, other.called)
wrapper.__name__ = fn.__name__
return wrapper
return decorator
@counting(foo)
def bar():
foo()
foo()
>>> bar()
foo was called 2 times
但是,如果最终foo
还是bar
可以自称,那么您将需要一个涉及堆栈的更复杂的解决方案来应对递归。然后,您将走向全面的探查器…
如果您仍在“自学Python”,可能是这种包装好的装饰器材料(通常用于魔术)不是理想的选择!