[Python-Dev] features i'd like [Python 3000] ... #3: fix super()

Ben Wing ben at 666.com
Mon Dec 4 04:06:07 CET 2006


i don't like the current super() at all.  having to type super(Foo, 
self).__init__(...) is messy, hard to remember, and error-prone.  it 
also introduces an unfortunate dependency in that the name of the class 
(Foo) has to be hard-coded in the call, and if you change the class name 
you also have to go and change all super() calls -- more chances for 
errors.  as a result, i imagine there's a strong urge to just hardcode 
the name of the parent -- a bad idea, and the reason why super() was 
introduced in the first place.

instead, `super' should work like in other languages.  a couple of ideas:

-- super.meth(args) calls the superclass method `meth', in the same way 
that super(Foo, self).meth(args) currently works. (this is the same 
syntax as in java.  this probably requires making `super' be a keyword, 
although it might be possible to hack this by examining the current call 
stack.)
-- as an alternative or in addition, super(args) would work like 
super.meth(args) if we're currently inside of `meth' in a subclass.  i 
suspect that 90% of the time or more, `super' is used to chain to the 
superclass version of an overridden method, and this optimizes for the 
common case.  it makes for one less possibility of misspelling 
`__init__' and one less thing that requires renaming if a method is 
renamed or code copied to another method (granted, this isn't such a big 
deal as in the case of class renaming).  if the form `super.meth(args)' 
isn't also supported, then a call of this sort would have to be made 
through the introspection API. (i think it would be a good idea to have 
this functionality available through the introspection API, in any 
case.  currently i don't see any obvious way in module `inspect' to find 
out which class a call to `super(...).meth(...)' is invoked on, although 
maybe a loop with inspect.getmro() and hasattr() would work.  it would 
be nice to have a function like inspect.getsuper(class, 'meth'), i think.)

ben



More information about the Python-Dev mailing list