Metaclasses are not called in subclasses. What did I wrong?

Georg Brandl g.brandl-nospam at gmx.net
Sun Oct 29 04:27:17 EST 2006


Létező wrote:
> I use Python 2.4.4. Please read the code below:
> 
> -----------------------------------------------------------
> from new import classobj
> 
> def mymeta(name,bases,clsdict):
>     print 'meta: %s'%name
>     return classobj(name,bases,clsdict)
> 
> class A(object):
>     __metaclass__=mymeta
> 
> class B(A):
>     pass
> 
> -----------------------------------------------------------
> 
> This should print
> 
> meta: A
> meta: B
> 
> when classes A and B are created. But only meta: B is missing,
> since mymeta() is not called when class B is created.
> 
> Related python documentation states that mymeta() must be called when B is 
> created, since metaclasses are looked up in bases classes if not found in 
> the dictionary of the class itself.
> 
>>From Python 2.4.4's manual: "Otherwise, if there is at least one base class, 
> its metaclass is used (this looks for a __class__ attribute first and if not 
> found, uses its type)."

Peter already explained that when __metaclass__ is not directly defined in the
class body, it's not used as the metaclass, but the class of the first base
class is.

This is an inconsistency IMHO, since Python normally respects inherited
attributes just like those defined in the class itself.

But well, you can live with it :)

Georg



More information about the Python-list mailing list