python利用函数装饰器实现对函数调用次数的跟踪

case1:
>>> class tracer: def __init__(self, func): self.calls = 0 self.func = func def __call__(self, *args, **keys): self.calls += 1 print('call %s to %s' % (self.calls, self.func.__name__)) self.func(*args, **keys) # python在定义此函数时,便会将spam作为参数传入__init__ # 类似于spam = tracer(spam) # 此时的spam已经指向tracer(spam)对象了 >>> @tracer def spam(a, b, c): print(a, b, c) # 此时调用spam函数,便相当于执行__call__(spam, *(1, 2, 3)) # 这里有运算符重载在起作用。此时的spam对象已经有calls属性了 >>> spam(1, 2, 3) call 1 to spam 1 2 3 >>> spam('a', 'b', 'c') call 2 to spam a b c # 可以通过calls属性查看其调用次数 >>> spam.calls 2
import types
 from functools import wraps

def profiled(func):
 ncalls = 0
 @wraps(func)
 def wrapper(*args, *kwargs):
 nonlocal ncalls
 ncalls += 1
 return func(args, **kwargs)
 wrapper.ncalls = lambda: ncalls
 return wrapper

Example
@profiled
 def add(x, y):
 return x + y

  



 

posted on 2021-10-20 17:39  朴先生  阅读(242)  评论(0)    收藏  举报

导航