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