diff options
Diffstat (limited to 'lab/find_class.py')
-rw-r--r-- | lab/find_class.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lab/find_class.py b/lab/find_class.py new file mode 100644 index 00000000..d8dac0b5 --- /dev/null +++ b/lab/find_class.py @@ -0,0 +1,40 @@ +class Parent(object): + def meth(self): + print("METH") + +class Child(Parent): + pass + +def trace(frame, event, args): + # Thanks to Aleksi Torhamo for code and idea. + co = frame.f_code + fname = co.co_name + if not co.co_varnames: + return + locs = frame.f_locals + first_arg = co.co_varnames[0] + if co.co_argcount: + self = locs[first_arg] + elif co.co_flags & 0x04: # *args syntax + self = locs[first_arg][0] + else: + return + + func = getattr(self, fname).__func__ + if hasattr(func, '__qualname__'): + qname = func.__qualname__ + else: + for cls in self.__class__.__mro__: + f = cls.__dict__.get(fname, None) + if f is None: + continue + if f is func: + qname = cls.__name__ + "." + fname + break + print("{}: {}.{} {}".format(event, self, fname, qname)) + return trace + +import sys +sys.settrace(trace) + +Child().meth() |