[Python-Dev] Classes and Metaclasses in Smalltalk (original) (raw)

Donald Beaudry Donald Beaudry donb@abinitio.com
Wed, 02 May 2001 10:41:14 -0400


Guido van Rossum <guido@digicool.com> wrote,

[Greg Ward, welcome back!] > * 'super' is a magic object that only makes sense inside a 'def' > inside a 'class' (at least for now; perhaps it could be generalized > to work at class scope as well as method scope, but let's keep > it simple)

Yes, that's about the only way it can be made to work. The compiler will have to (1) detect that 'super' is a free variable, and (2) make it a local and initialize it with the proper magic. Or, to relieve the burden from the symbol table, we could make super a keyword, at the cost of breaking existing code.

I'm not at all sure I like the idea of 'super'. It's far more magic that I am used to (coming from Python at least). Currently, we spell 'super' like this:

 class foo(bar):
     def __repr__(self):
         return bar.__repr__(self)  # that's super!

I like the explicit nature of it. As Guido points out however, this ends up being ambiguous when we try to make classes more "instance-like".

Now, how do I like to spell super?

 class foo(bar):
     def __repr__(self):
         return bar._.__repr__(self)  # now that's really super!

or, for those who like the "keyword":

 class foo(bar):
     def __repr__(self):
         super = bar._
         return super.__repr__(self)

The trick here in the implementation of getattr on the '_'. It return a proxy object for the class. When attributes are accessed through it a different search path is taken. This path is the same path that would be taken by instance attribute look up. In my code, I refer to this object as the 'unbound instance'. Since accessing a function through this object will yield an unbound instance method, the name makes sense to me.

-- Donald Beaudry Ab Initio Software Corp. 201 Spring Street donb@init.com Lexington, MA 02421 ...So much code, so little time...