super() and type()

Carl Banks pavlovevidence at gmail.com
Mon Nov 27 21:25:43 CET 2006


Chris Mellon wrote:
> I see super documented, and in use, as below (from the Python documentation)
>
> class C(B):
>     def meth(self, arg):
>         super(C, self).meth(arg)
>
> I'd like to not write C all the time, so is there any problem with writing:
>
> class C(B):
>     def meth(self, arg):
>         super(type(self), self).meth(arg)
>
>
> This seems to work in practice but I don't see it used anywhere and
> I'm worried what I might be missing.
>
> This was especially brought to my attention because pylint flags the
> second usage as invalid, and I'm not sure if it should be considered a
> false positive or not.

PyLint is right.  Try running this:


class A(object):
    def meth(self,arg):
        print "hello"

class B(A):
    def meth(self,arg):
        super(type(self), self).meth(arg)

class C(B):
     def meth(self,arg):
        super(type(self), self).meth(arg)

print C().meth(1)


The reason this type(self) returns the type of the object (which
doesn't change), NOT the type of the class it was defined in.  That is,
type(self) returns C even in the function B.meth.  Since C's superclass
is B, B.meth ends up calling B.meth again, and you get infinite
recursion.

Unfortunately, short of hackery, you're stuck with having to write out
super(C,self).


Carl Banks




More information about the Python-list mailing list