def list_all_mro_mthds(klass,mthd_name): ret = [] called = set([None]) for cls_obj in klass.__mro__: mthd = getattr(cls_obj,mthd_name,None) if not mthd in called: called.add(mthd) ret.append(mthd) return ret # assumes all methods of interest will be callable in decendant class def class_info(klass): mthds = {} cnt=0 # mro = for en in dir(klass): if (en[:2]=="__"):continue attr = getattr(klass,en,None) if (not callable(attr)):continue # p(en,type(attr)) # p(en,type(attr)) # p(attr) m2 = list_all_mro_mthds(klass,en) # if (len(m2)>1): if 1: p(len(m2),en) for m in m2: # p("\t",m) p(" ",m) cnt+=1 # p(len(klass.__mro__)) # p(len(set(klass.__mro__))) # p(klass.__mro__) p(cnt) run_now() # p("/") # class_info(Mixins.DevMixin) # class_info(Mixins.DevRlist) # p(class_info)