[Python-Dev] __metaclass__ problem

Nick Coghlan ncoghlan at iinet.net.au
Sat Mar 19 00:55:04 CET 2005


Dirk Brenckmann wrote:
> In consequence a programmer only is in control of the "metaclass" of his
> class, if he decides it to be a subtype of all former metaclasses he used in
> his class hierarchy, or if he uses the same metaclass as the superclass
> does.

The behaviour is intentional, but you are correct that it is not fully 
documented in the official documentation [1].

Some of the 'wrinkles' described in Guido's original Python 2.2 essay [2] may 
need to be transferred to the docs.

For instance:

"""For new-style metaclasses, there is a constraint that the chosen metaclass is 
equal to, or a subclass of, each of the metaclasses of the bases. Consider a 
class C with two base classes, B1 and B2. Let's say M = C.__class__, M1 = 
B1.__class__, M2 = B2.__class__. Then we require issubclass(M, M1) and 
issubclass(M, M2). (This is because a method of B1 should be able to call a 
meta-method defined in M1 on self.__class__, even when self is an instance of a 
subclass of B1.)"""

If you are not getting an exception when breaking this rule, my guess would be 
that your metaclasses are not inheriting from 'type', or else are not invoking 
type's __new__ method. The logic to trigger the exception lives in type's 
__new__ method - if that doesn't get invoked, you won't get the exception.

(Note that this also addresses your final objection: if you genuinely don't like 
the behaviour imposed by using 'type' as the metaclass, then don't use 'type' as 
the metaclass!)

Cheers,
Nick.

[1] http://www.python.org/dev/doc/devel/ref/metaclasses.html
[2] http://www.python.org/2.2/descrintro.html#metaclasses

-- 
Nick Coghlan   |   ncoghlan at email.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://boredomandlaziness.skystorm.net


More information about the Python-Dev mailing list