[Python-Dev] Metatype conflict among bases?

David Abrahams dave@boost-consulting.com
Tue, 22 Apr 2003 22:39:11 -0400


"Phillip J. Eby" <pje@telecommunity.com> writes:

> The problem here is that B.__metaclass__ *must* be the same as, or a
> subclass of, A.__metaclass__, or vice versa.  It doesn't matter
> whether the metaclass is specified implicitly or explicitly, this
> constraint must be met.  Your code doesn't meet this constraint.
> Here's a revised example that does:
>
>      class A(object):
>          class __metaclass__(type):
>              pass
>
>      class B(A):
>          class __metaclass__(A.__class__):
>              pass
>
> B.__metaclass__ will now meet the "metaclass inheritance" constraint.
> See the "descrintro" document for some more info about this, and the
> "Putting Metaclasses To Work" book for even more info about it than
> you would ever want to know.  :)

I knew all that once, and have since forgotten more than I knew :(.

I actually already managed to make the code work by doing what you did
above, so it couldn't have been buried too deeply in the caves of my
brain.

> Here's a short statement of the constraint, though:
>
> A class X's metaclass (X.__class__) must be identical to, or a
> subclass of, the metaclass of *every* class in X.__bases__.  That is:
>
> for b in X.__bases__:
>      assert X.__class__ is b.__class__ or issubclass(X.__class, b.__class__),\
>          "metatype conflict among bases"

Still, the message is misleading.  There's only one base class, so the
metatype conflict is not "among bases".

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com