raising an exception when multiple inheritance involves same baseThank

Paul McGuire ptmcg at austin.rr.com
Sun May 25 12:32:39 EDT 2008


On May 25, 8:37 am, Michael Hines <michael.hi... at yale.edu> 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"



More information about the Python-list mailing list