[Python-3000] Metaclasses in Py3K
Phillip J. Eby
pje at telecommunity.com
Fri Dec 8 19:21:54 CET 2006
At 08:53 AM 12/8/2006 -0600, Guido van Rossum wrote:
>I've been thinking about this too, and I think it's reasonable to let
>the metaclass provide the dict to be used as locals. This is easier
>when the metaclass is given in the class header, e.g. by way of a base
>class, or through the default metaclass. Although the default default
>metaclass could of course have a hook to pass things on to another
>metaclass specified using a __metaclass__ assignment, I'd rather
>innovate a bit more and add keyword arguments to the class header,
>e.g.
>
>class C(B1, B2, metaclass=Foo):
> ...
Did you have any idea for what other keywords besides 'metaclass' might
mean? Otherwise, this doesn't seem to add much over, say:
class C(metaclass(Foo), B1, B2):
(Except that metaclass() would then have to be a built-in, I suppose.)
I definitely like the idea of the metaclass getting to control the locals()
of the class suite, but then again it also seems like it would be just as
easy to say that the class statement creates a class/type object (using the
normal metaclass rules applied to the bases), and then the suite executes
with a locals() that does getattr(cls, name) and setattr(cls, name, val)
for getitem and setitem.
This allows you to do a variety of interesting things, including assigning
to __class__ in the body of the class to set (or change!) the metaclass
directly, and allowing you to define metaclass-level properties. You can
also access *inherited* methods and attributes in the body of the class
(due to the use of getattr()).
With those features in place, I'm not sure what we'd do with class
statement keywords, unless we were going to use them to create
parameterized types or something, which might be cool, but I have no idea
at the moment how to go about doing it. :)
More information about the Python-3000
mailing list