[Python-3000] Changing order of class creation

Jack Diederich jack at performancedrivers.com
Mon Apr 24 18:32:47 CEST 2006


On Mon, Apr 24, 2006 at 10:53:39AM -0500, Ian Bicking wrote:
> Here's something for the crazy idea bin...
> 
> Right now class creation looks like:
> 
>    class X(base):
>        y = 'z'
> 
> This gets the things in the () (object), evaluates the body of the class 
> in a new scope and captures that scope (namespace), and looks for a 
> metaclass using a couple rules.  Then it does:
> 
>    X = metaclass('X', (base,), {'y': 'z'})
> 
> What if instead it did:
> 
>    X = metaclass('X', (base,))
>    X.y = 'z'

This would make overriding __new__ in a metaclass useless because
if you are defining __new__ instead of __init__ you presumably want
to return different things depending on the content of the namespace.

> ?  X could keep track of order if it wanted.  Or not.  There would be no 
> conflict between metaclasses paying special attention to the constructor 
> namespace, and later attribute setting on the same class (most 
> metaprogramming techniques with metaclasses choose one or the other). 

I've been working on a dict-alike that is used just for namespaces
(py3k list[1]).  I'm hoping it can be faster than a generic dict and
also keep track of the order the keys are defined but faster is the
main goal.  Slow going, dicts have _a lot_ of methods to cover.

> It could make rebuilding a class easier (as in reload).  If 
> metaclass('X', (bases,)) returned the already-existant X class, 
> attributes will get folded in.  (There's still problems there, but maybe 
> this helps a little.)

Can't you do this already?

-Jack

[1] "Specializing the dicts in __dict__"
  http://article.gmane.org/gmane.comp.python.python-3000.devel/641/


More information about the Python-3000 mailing list