"""Inheritance in python
"""
# This module defines several types of shapes (Rectangle, Circle)
# using inheritance from a base class called Shape.
# In inheritance:
# The more general class is called the base class or superclass.
# The more specific class is called the derived class or subclass.
# First we will need the Point class we have already defined:
import math
class Point (object) :
"""Point is a class that stores a two dimensional point"""
def __init__(self, x=0, y=0) :
self.x = x
self.y = y
def distance_to_origin(self) :
"""compute the distance of a point from the origin"""
return math.sqrt(self.x*self.x + self.y *self.y)
def distance(self, other) :
"""compute the distance between a point object and another
point object"""
return math.sqrt((self.x - other.x)**2 +
(self.y - other.y)**2)
def duplicate(self) :
return Point(self.x, self.y)
def __repr__(self) :
return "Point object with x = %d, y = %d" % (self.x, self.y)
class Shape (object) :
def __init__(self, x=0, y=0) :
"""creates an instance of a Shape with a location given
by x and y"""
self.location = Point(x, y)
def move(self, x, y) :
"""move a shape object to a location given by x and y"""
self.location = Point(x, y)
def distance_to_origin(self) :
return self.location.distance_to_origin()
def distance(other) :
return self.location.distance(other.location)
def __repr__(self) :
return "A shape located at: " + str(self.location)
class Rectangle (Shape) :
"""A class that represents a rectangle"""
def __init__(self, width=1, height=1, x=0, y=0) :
"""width - the width of the rectangle
height - the height of the rectangle"""
self.width = width
self.height = height
Shape.__init__(self, x, y)
def duplicate(self) :
return Rectangle(self.width, self.height, self.x, self.y)
def area(self) :
"""returns the area of the rectangle"""
return self.width * self.height
def perimeter(self) :
"""returns the perimiter of the rectangle"""
return 2 * self.width + 2 * self.height
def scale(self, s) :
"""rescale the size of the rectangle by the given amount"""
self.height *= s
self.width *= s
def __repr__(self) :
return "Rectangle with width = %f height = %f" % (self.width, self.height)
rect1 = Rectangle(1, 2)
rect2 = Rectangle()
# When we define a method in the derived class it overrides the corresponding
# method from the base class.
# Note that you have to call the constructor of the base class explicitly:
# Shape.__init__(self, location)
import math
class Circle (Shape) :
"""A class that represents a circle"""
def __init__(self, radius=1, x=0, y=0) :
"""radius - the radius of the circle"""
Shape.__init__(self, x, y)
self.radius = radius
def duplicate(self) :
return Circle(self.radius, self.x, self.y)
def area(self) :
"""returns the area of the rectangle"""
return math.pi * self.radius * self.radius
def perimeter(self) :
"""returns the perimiter of the rectangle"""
return 2 * math.pi * self.radius
def scale(self, s) :
"""rescale the size of the rectangle by the given amount"""
self.radius *= s
def __repr__(self) :
return "Circle with radius = %f" % self.radius
circ1 = Circle(2)
circ2 = Circle()
# Why use inheritance?
# - Code reuse - code from the base class does not need to be repeated.
# Leads to easier maintenance of the code.
# - Adding functionality to the base class automatically reflects in the
# Derived classes.
