[Python-3000] Fixing super anyone? (redux) (original) (raw)

Joel Bender jjb5 at cornell.edu
Wed Apr 25 16:44:15 CEST 2007


But I haven't figured out how to do that yet...

It turns out to be easier than I thought, and it avoids changing the object class, which is ugly.

 class _super(property):
     def __init__(self):
         property.__init__(self, self.get_super, None, None)

     def get_super(self, klass):
         class wrapper:
             def __getattr__(self, fn):
                 for cls in klass.__mro__[1:]:
                     f = getattr(cls, fn, None)
                     if f:
                         return f

                 raise AttributeError, fn

         return wrapper()

 class _superable(type):
     __super__ = _super()

 class W(object):
     __metaclass__ = _superable

     def f(self):
         print "W"

 class X(W):
     def f(self):
         print "X"
         X.__super__.f(self)

 class Y(W):
     def f(self):
         print "Y"
         Y.__super__.f(self)

 class Z(X, Y):
     def f(self):
         print "Z"
         Z.__super__.f(self)

I'll go back to lurking now...

Joel



More information about the Python-3000 mailing list