[Python-3000] auto-super()

Ian Bicking ianb at colorstudy.com
Tue Apr 18 18:58:08 CEST 2006


Aahz wrote:
> On Tue, Apr 18, 2006, Thomas Wouters wrote:
> 
>> - Compiler hackery involving a magical variable name, say '__class__'
>>or '__CLASS__'. The compiler would treat this specially, probably
>>stored in the class dict, and type() (which is, after all, called to
>>actually create the class) would stuff the actual class object in
>>there. It causes a reference cycle, but all newstyle classes already
>>do that ;P The main issue is that __CLASS__ would be new magic. It
>>wouldn't exist when the class body is executed, and it would be a
>>special form of enclosed variable afterwards (it should be extracted
>>from the class namespace, using a similar mechanism as closures.)
> 
> 
> It's not clear to me that this requires compiler hackery, just metaclass
> hackery.  Am I missing something?
> 
> Also, my idea is that self.super is a bound method/closure that already
> contains a reference to the class.  This makes dynamic classes more
> difficult in some ways, but anyone who wants to play those sorts of games
> should expect to do some magic mangling.  If it's reasonably
> well-documented, it wouldn't even be that difficult.

Well:

class A(object):
     def whoami(self):
         return 'A'
     def dostuff(self):
         print 'I (%s) am doing A stuff...' % (self.whoami())

class B(A):
     def whoami(self):
         return 'B-ish %s' % (self.super.whoami())
     def dostuff(self):
         print 'Some B stuff...'
         self.super.dostuff()

class C(B):
     def whoami(self):
         return 'C'
     def dostuff(self):
         print 'Some C stuff...'
         self.super.dostuff()

Reading this statically, I think it's clear how this should work.  So, 
when C().dostuff() is called, we want to see:

   Some C stuff...
   Some B stuff...
   I (C) am doing A stuff...

When B().dostuff() is called, we want to see:

   Some B stuff...
   I (B-ish A) am doing A stuff...

But how can we do that without the function being bound to a class? 
self.whoami() in A.dostuff needs to access the 'real' self.  self.super 
in B.dostuff should be super(B, self), even when self.__class__ is C.

Because Python *isn't* reading the functions statically to determine 
class and method layout, actually making this work seems very hard.

-- 
Ian Bicking  /  ianb at colorstudy.com  /  http://blog.ianbicking.org


More information about the Python-3000 mailing list