In Python 2.5, the following code raises a TypeError:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
If I replace the class X with class X(object), it will work. What’s the explanation for this?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The reason is that super() only operates on new-style classes, which in the 2.x series means extending from object:
>>> class X(object):
def a(self):
print 'a'
>>> class Y(X):
def a(self):
super(Y, self).a()
print 'b'
>>> c = Y()
>>> c.a()
a
b
Method 2
In addition, don’t use super() unless you have to. It’s not the general-purpose “right thing” to do with new-style classes that you might suspect.
There are times when you’re expecting multiple inheritance and you might possibly want it, but until you know the hairy details of the MRO, best leave it alone and stick to:
X.a(self)
Method 3
In case none of the above answers mentioned it clearly. Your parent class needs to inherit from “object”, which would essentially turn it into a new style class.
# python 3.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is also a new style class ( implicit inheritance from object )
pass
# Python 2.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is a old style class
pass
Method 4
I tried the various X.a() methods; however, they seem to require an instance of X in order to perform a(), so I did X().a(self), which seems more complete than the previous answers, at least for the applications I’ve encountered. It doesn’t seem to be a good way of handling the problem as there is unnecessary construction and destruction, but it works fine.
My specific application was Python’s cmd.Cmd module, which is evidently not a NewStyle object for some reason.
Final Result:
X().a(self)
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0