[Python-Dev] Breaking calls to object.__init__/__new__

Phillip J. Eby pje at telecommunity.com
Thu Mar 22 05:53:24 CET 2007


At 09:41 PM 3/21/2007 -0700, Guido van Rossum wrote:
>On 3/21/07, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
> > Every time I've considered using super, I've eventually
> > decided against it for reasons like this. I've always
> > found a better way that doesn't introduce so may
> > strange interactions between the classes involved.
>
>I end up feeling the same way, for purely pragmatic reasons. However,
>cooperative multiple inheritance is a respected religion, and when
>practiced systematically can work well.
>
>Also make a big distinction between super calls of __init__ (which are
>a Pythonic wart and don't exist in other languages practicing multiple
>inheritance AFAIK) and super calls of regular methods (which are
>virtually problem-free as long as you agree on a base class that
>defines a method and derive from that class when you want to extend
>it).

FYI, the only time I ever use super() for __init__ calls is for 
metaclasses.  However, there the signature is fixed, so this problem 
doesn't really arise.

However, in Py3K the metaclass __init__ will accept keyword 
arguments.  What's the right thing to do there?  Should we pass them all 
through?

I'm not sure if there's any inherent symmetry between this and 
object.__init__ -- but it seems to be an interesting question in its own right.

The whole point of being co-operative in a metaclass is to allow other 
metaclasses to be safely mixed in -- and they may be metaclasses from a 
completely different library or framework.  So, it's not as simple as 
saying "use a specialized base class" -- the class author may not even 
*know* that metaclasses are involved, let alone multiple ones.



More information about the Python-Dev mailing list