Reputation: 41
I'm new to python, I have the code below which I just can't get to work:-
This is inheritance, I have a circle base class and I inherit this within a circle
class (just single inheritance here).
I understand the issue is within the ToString()
function within the circle
class, specifically the line, text = super(Point, self).ToString() +..
which requires at least a single argument, yet I get this:
AttributeError: 'super' object has no attribute 'ToString'
I know super
has no ToString
attribute, but the Point
class does -
My code:
class Point(object):
x = 0.0
y = 0.0
# point class constructor
def __init__(self, x, y):
self.x = x
self.y = y
print("point constructor")
def ToString(self):
text = "{x:" + str(self.x) + ", y:" + str(self.y) + "}\n"
return text
class Circle(Point):
radius = 0.0
# circle class constructor
def __init__(self, x, y, radius):
super(Point, self) #super().__init__(x,y)
self.radius = radius
print("circle constructor")
def ToString(self):
text = super(Point, self).ToString() + "{radius = " + str(self.radius) + "}\n"
return text
shapeOne = Point(10,10)
print( shapeOne.ToString() ) # this works fine
shapeTwo = Circle(4, 6, 12)
print( shapeTwo.ToString() ) # does not work
Upvotes: 3
Views: 5270
Reputation: 1121386
You need to pass in the Circle
class instead:
text = super(Circle, self).ToString() + "{radius = " + str(self.radius) + "}\n"
super()
will look through the base classes of the first argument to find the next ToString()
method, and Point
doesn't have a parent with that method.
With that change, the output is:
>>> print( shapeTwo.ToString() )
{x:0.0, y:0.0}
{radius = 12}
Note that you make the same mistake in your __init__
; you are not calling the inherited __init__
at all. This works:
def __init__(self, x, y, radius):
super(Circle, self).__init__(x ,y)
self.radius = radius
print("circle constructor")
and then the output becomes:
>>> shapeTwo = Circle(4, 6, 12)
point constructor
circle constructor
>>> print( shapeTwo.ToString() )
{x:4, y:6}
{radius = 12}
Upvotes: 5