super() fails with error: TypeError "argument 1 must be type, not classobj" when parent does not inherit from object super() fails with error: TypeError "argument 1 must be type, not classobj" when parent does not inherit from object python python

super() fails with error: TypeError "argument 1 must be type, not classobj" when parent does not inherit from object


Your problem is that class B is not declared as a "new-style" class. Change it like so:

class B(object):

and it will work.

super() and all subclass/superclass stuff only works with new-style classes. I recommend you get in the habit of always typing that (object) on any class definition to make sure it is a new-style class.

Old-style classes (also known as "classic" classes) are always of type classobj; new-style classes are of type type. This is why you got the error message you saw:

TypeError: super() argument 1 must be type, not classobj

Try this to see for yourself:

class OldStyle:    passclass NewStyle(object):    passprint type(OldStyle)  # prints: <type 'classobj'>print type(NewStyle) # prints <type 'type'>

Note that in Python 3.x, all classes are new-style. You can still use the syntax from the old-style classes but you get a new-style class. So, in Python 3.x you won't have this problem.


Also, if you can't change class B, you can fix the error by using multiple inheritance.

class B:    def meth(self, arg):        print argclass C(B, object):    def meth(self, arg):        super(C, self).meth(arg)print C().meth(1)


If the python version is 3.X, it's okay.

I think your python version is 2.X, the super would work when adding this code

__metaclass__ = type

so the code is

__metaclass__ = typeclass B:    def meth(self, arg):        print argclass C(B):    def meth(self, arg):        super(C, self).meth(arg)print C().meth(1)