By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,715 Members | 768 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,715 IT Pros & Developers. It's quick & easy.

super() and type()

P: n/a
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.
Nov 27 '06 #1
Share this Question
Share on Google+
2 Replies


P: n/a
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

Nov 27 '06 #2

P: n/a
Chris Mellon wrote in
news:ma**************************************@pyth on.org in
comp.lang.python:
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.
Have you considered what happens if somebody writes:

class D(C):
def meth(self, arg):
super( D, self ).meth( arg )
>
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.
Nope, the type argument to super tells it where you are in the
type hierarchy, type(self) is always the top of the hierarchy.

Rob.
--
http://www.victim-prime.dsl.pipex.com/
Nov 27 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.