On May 25, 8:37 am, Michael Hines <[EMAIL PROTECTED]> wrote: > Thanks very much, Arnaud. That is exactly the hint I needed. Since it is > not multiple inheritance per se I prohibit but only multiple inheritance > involving more than one HocObject class, I replaced your len(bases) > 1 > test with > <code> > m = False > for b in bases : > if hasattr(b, '__mro__'): > for bb in b.__mro__ : > if bb == MetaHocObject.ho : > if m == True: > raise Exception("Inheritance of multiple HocObject not > allowed") > m = True > > </code> > to get > > class A(HocObject): pass > > class B(object): pass > > class C(): pass > > class D(C, B, HocObject): pass # ok > > class D(C, A, HocObject): pass # fail > > When I fold this idea into my code I may even try to eliminate the class > factory aspect of > class Foo(hclass(h.Vector)) > in favor of > class Foo(h.Vector) > > Thanks again, > Michael
Here's a more general version of your testing code, to detect *any* diamond multiple inheritance (using your sample classes). -- Paul for cls in (A,B,C,D): seen = set() try: bases = cls.__bases__ for b in bases: if hasattr(b,"__mro__"): for m in b.__mro__: if m in seen: raise Exception("diamond multiple inheritance") seen.add(m) except Exception, e: print cls,"has diamond MI" else: print cls,"is ok" -- http://mail.python.org/mailman/listinfo/python-list