Slight metaclass confusion

Stephan Diehl stephan.diehl at gmx.net
Tue Sep 9 07:54:00 EDT 2003


ben at transversal.com wrote:

> I am slightly confused about the way metaclasses work, having read
> "Metaclass Programming In Python, Parts 1 and 2"
> 
> I get the fact that the instance of a metaclass is a class, but in
> this case I fail to see why the following does'nt work:
> 
>>>> class Meta(type):
> ...     def __str__(cls):
> ...             print "I am " + repr(cls)
> ...
>>>> 
>>>> Class = Meta("Fish", (), {})
>>>> Class.__str__()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
> TypeError: descriptor '__str__' of 'object' object needs an argument
> 
> Whereas this does:
> 
>>>> class Simple(object):
> ...     def __str__(self):
> ...             return "I am " + repr(self)
> ...
>>>> obj = Simple()
>>>> obj.__str__()
> I am <__main__.Simple object at 0x402f676c>
> 
> The tutorial does mention this (slightly), but doesn't make it clear
> why this is happening. I am probably missing something obvious though!

The problem is perhaps the terminology (Unfortunatelly,I don't know a better
one).

The metaclass initializes a class. Just imagine, that the textual class
definition comes fresh from the parser, so you have information about
possible base classes, methods, attributes. These information can be
changed within the metaclass __new__ method.
Think of the metaclass as a factory that turns a class definition into a
class instance.
Other than that, they don't interact.

What a metaclass can do, is to change that information, before the class is
made into a class object.

Basicly, the metaclass concept is orthogonal to the inheritence concept of
OOP.

> 
> Thanks for the help,
> 
> Ben
> ---

Hope that helps

Stephan





More information about the Python-list mailing list