This is the 3rd article in a series on Object-Oriented Programming:
- Classes and Objects in Python
- Object-Oriented Programming: Encapsulation in Python
- Inheritance in Python
- Object-Oriented Programming: Polymorphism in Python
Let’s define a generic Vehicle class and save it inside the vehicle.py file.
class Vehicle:
def __init__(self, year, model, plate_number, current_speed):
self.year = year
self.model = model
self.plate_number = plate_number
self.current_speed = current_speed
def move(self):
self.current_speed += 1
def accelerate(self, value):
self.current_speed += value
def stop(self):
self.current_speed = 0
def vehicle_details(self):
return 'Model: ' + self.model + ', Year: ' + str(self.year) + ', Plate: ' + self.plate_numberA vehicle has attributes year, model, plate_number, and current_speed.
The definition of vehicle in the Vehicle is very generic and might not be suitable for trucks for instance because it should include a cargo attribute.
On the other hand, a cargo attribute does not make much sense for small vehicles like motorcycles.
To solve this we can use inheritance.
When a class (child) inherits another class (parent), all the attributes and methods from to parent class are inherited by the child class.
Parent and Child
In our case, we want a new Truck class to inherit everything from the Vehicle class and add its own specific attribute current_cargo to control the addition and removal of cargo from the truck.
The Truck class is called a child class that inherits from its parent class Vehicle.
A parent class is also called a superclass while a child class is also known as a subclass.
Create the class Truck and save it inside the truck.py file.
from vehicle import Vehicle
class Truck(Vehicle):
def __init__(self, year, model, plate_number, current_speed, current_cargo):
super().__init__(year, model, plate_number, current_speed)
self.current_cargo = current_cargo
def add_cargo(self, cargo):
self.current_cargo += cargo
def remove_cargo(self, cargo):
self.current_cargo -= cargoLet’s break down the class to explain it in parts.
The class Vehicle inside the parentheses when defining the class Truck indicates that the parent Vehicle is being inherited by its child Truck.
The init method has self as its first parameter, as usual.
The parameters year, model, plate_number, and current_speed are there to match the ones in the Vehicle class.
We added a new parameter current_cargo suited for the Truck class.
In the first line of the init method of the Truck class we have to call the init method of the Vehicle class.
To do that we use super() to make a reference to the supperclass Vehicle, so when super().init(year, model, plate_number, current_speed) is called we avoid repetition of code.
After that, we can assign the value of current_cargo normally.
Finally, we have two methods to deal with the current_cargo: def add_cargo(self, cargo):, def remove_cargo(self, cargo):.
Remember that Truck inherits attributes and methods from Vehicle, so we also have an implicit access to the methods that manipulate the speed: def move(self), def accelerate(self, value), def stop(self).
Using the Truck class
Use the class on a terminal, import the Truck class from the truck module.
Create an instance called my_truck, initializing year with 2015, model with ‘V8’, plate_number with ‘XYZ1234’, current_speed with 0, and current_cargo with 0.
Use add_cargo(10) to increase current_cargo by 10, remove_cargo(4), to decrease current_cargo by 4.
Remember to print the value of current_cargo at every command to see the changes.
By inheritance, we can use the methods from the Vehicle class to move() the truck which increases its current_speed by 1, accelerate(10) which increases its current_speed by the value given in the argument, and stop() which sets the current_speed to 0.
Remember to print the value of current_speed at every interaction to see the changes.
To finish the test, call vehicle_details() inherited from the Vehicle class to print the information about our truck.
>>> from truck import Truck
>>>
>>> my_truck = Truck(2015, 'V8', 'XYZ1234', 0, 0)
>>> print(my_truck.current_cargo)
0
>>> my_truck.add_cargo(10)
>>> print(my_truck.current_cargo)
10
>>> my_truck.remove_cargo(4)
>>> print(my_truck.current_cargo)
6
>>> print(my_truck.current_speed)
0
>>> my_truck.accelerate(10)
>>> print(my_truck.current_speed)
10
>>> my_truck.stop()
>>> print(my_truck.current_speed)
0
>>> print(my_truck.vehicle_details())
Model: V8, Year: 2015, Plate: XYZ1234