user2410243
user2410243

Reputation: 187

inheritance in python 2.7.x

I did this code:

class Square(Quad):
    def __init__(self, linesValue):
        """Calls the builder in quad (same)"""
        super(Square, self).__init__(linesValue)

then It said I have to send type as first arg, so I did this:

class Square(Quad):
    def __init__(self, linesValue):
        """Calls the builder in quad (same)"""
        super(type(Square), self).__init__(linesValue)

then it said obj must be instance of subinstance of class, and as you can see Square(Quad) it is.

Upvotes: 6

Views: 8925

Answers (2)

alko
alko

Reputation: 48317

You have bad indentation, and so your super is outside of __init__. Compare:

>>> class Square(Quad):
...     def __init__(self, linesValue):
...         """Calls the builder in quad (same)"""
...         super(Square, self).__init__(linesValue)
...
>>>

and

>>> class Square(Quad):
...     def __init__(self, linesValue):
...         """Calls the builder in quad (same)"""
...     super(type(Square), self).__init__(linesValue)
...
Traceback (most recent call last):
  ...
TypeError: super(type, obj): obj must be an instance or subtype of type

and

>>> class Square(Quad):
...     def __init__(self, linesValue):
...         """Calls the builder in quad (same)"""
...     super(Square, self).__init__(linesValue)
...
Traceback (most recent call last):
   ...
TypeError: super(type, obj): obj must be an instance or subtype of type

Upvotes: 2

Ashwini Chaudhary
Ashwini Chaudhary

Reputation: 250951

Considering your indentation is correct then in Python2 a class should inherit from object, otherwise it would be considered as a classic class. And you can't use super on a classic class.

So, if Quad is defined like this, then it is wrong:

class Quad:
    def __init__(self, x):
       pass

And instantiating Square will raise error like this:

>>> Square(12)
    ...
    super(Square, self).__init__(linesValue)
TypeError: must be type, not classobj

Change Quad to inherit from object:

class Quad(object):
    def __init__(self, x):
       print x

Demo:

>>> Square(12)
12
<__main__.Square object at 0x93e286c>

Upvotes: 7

Related Questions