import sys class Tracer: def __init__(self, clazz=None): self.clazz = clazz def set_trace(self): print('sys.settrace(%s.trace)' % self.__class__.__name__) sys.settrace(self.trace) f = sys._getframe().f_back while f: f.f_trace = self.trace f = f.f_back def trace(self, f, event, arg): print('%s:%s at %s:%d' % (self.__class__.__name__, event, f.f_code.co_name, f.f_lineno)) if self.clazz and event == 'call': self.clazz().set_trace() return self.trace class New_tracer(Tracer): pass def foo(): bar() lineno = 25 def bar(): pass Tracer(New_tracer).set_trace() foo()