def tracer(func): # Remember original def oncall(*args): # On later calls oncall.calls += 1 print(f'call {oncall.calls} to {func.__name__}') return func(*args) oncall.calls = 0 return oncall class C: @tracer def hack(self, a, b, c): return a + b + c if __name__ == '__main__': x = C() print(x.hack(1, 2, 3)) print(x.hack('a', 'b', 'c'))