Introduction to Inheritance in Python
Inheritance is the capability of a class to inherit all methods of base class from which it is derived and can add new features to the class without modifying it. This helps represent the real-world problem better and reusability of code with data protection with features like encapsulation in simple language. In Inheritance, the class that derives the properties of other class is called a derived class, and the class which is derived is known as a base class.
Class Syntax
The syntax to define a derived class when one or more base classes are to be inherited is as follows:
class derivedClassName(baseClassName[,...]):
<statement 1>
...
...
<statement n>
As shown, the derived class specifies a comma-separated list of base classes to inherit from in the class definition header.
Class Cuisine
Let’s start by defining a base class used for all our examples:
class cuisine():
def __init__(self,type):
self.type = type
return
cooked_cuisine = new cuisine('cooked')
The base shown defines an object template used to define cuisines and capture whether it’s a cooked cuisine or not. It also has a constructor used to accept the type of cuisine. Later an object is created of type ‘cooked’.
Types of Inheritance in Python
There are mainly two types of inheritance, a combination of which yields every other type.
1. Single Inheritance : One base class, inherited by one derived class. This is the simplest type of inheritance. Also, the minimal possible one. The derived class automatically invokes the base class constructor.
2. Multiple Inheritance : Multiple base classes inherited by one derived class. The base class constructors are invoked in the order in which classes were derived.
Derived Types of Inheritance
Combining the above two forms of inheritance can lead to the following types of inheritance:
1. Hierarchical Inheritance: One base class inherited by multiple derived classes. Each derived class will work independently, but objects share the class variables across different classes.
2. Multi-level Inheritance: A derived class serving as a base class for another derived class. The base class constructors are invoked recursively in this case.
3. Hybrid Inheritance: A combination of multiple instances of the above-mentioned types of inheritance. This could lead to any imaginable combination of classes.
Examples of Inheritance in Python
Below are examples of Inheritance in Python:
1. Single Inheritance
Let’s create a class called Indian Cuisine, which inherits class cuisine.
class indian_cuisine(cuisine):
def __init__(self,type,place):
super().__init__(type)
self.place = place
return
indian_cuisine = new cuisine('cooked','India')
As shown in a new class, indian_cusine was created, which accepts the type parameter and invokes a base class constructor, passing the parameter. It additionally creates a new object variable place. This is used only in the derived class and not visible to base class objects.
2. Hierarchical Inheritance
Let’s create a class called ItalianCuisine which inherits class cuisine:
class italian_cuisine(cuisine):
def __init__(self,type,place):
super().__init__(type)
self.place = place
return
italian_cuisine = new cuisine('cooked','Italy')
As shown in a new class, italian_cusine was created, which accepts the type parameter and invokes a base class constructor, passing the parameter. It additionally creates a new object variable place. This is used only in the derived class and not visible to base class objects. Now, Since two classes, indian_cusines and italian_cuisine, inherit the cuisine class, there’s a hierarchical inheritance implemented.
3. Multiple Inheritance
Let’s create a class called FineDineCuisine, which inherits from multiple classes.
class fine_dine_cuisine(indian_cuisine,italian_cuisine):
def __init__(self,type,place,portion_size):
super().__init__(type,place)
self.portion_size = portion_size
return
fine_dine_cuisine = new cuisine('cooked','India',4)
The new class fine_dine_cuisine inherits from both indian_cuisine and italian_cuisine, inheriting their parameters. It accepts the parameters type, place and portion_size. type and place are passed as arguments for base class constructors. portion_size is a new object parameter not shared to base classes.
Note on Diamond Inheritance:
Now since both indian_cuisine and italian_cuisine inherit from cuisine class, it forms a classic case of diamond inheritance, where multiple instances of a base class are directly/indirectly present for a derived class. In most languages, like c++, this causes a problem, or abstract classes are used. Python, on the other hand, specifies its own innovative solution. It inherits the common methods and attributes only once, giving preference to classes in the order of inheritance. Thus, here, since cuisine is inherited twice, preference is given to the indian_cuisine version of cuisine, as it’s inherited first.
Note on Class Members:
Any attribute defined within the class definition but not within a function becomes a class attribute and is shared across all instances of the class. Thus if one object changes any of these class attributes, the changes are visible to all other instances (whether for the same class object or derived class object). Thus be careful while using class attributes not present within any method definition.
Conclusion – Inheritance in Python
Python has once again defined a very flexible, accommodating, and powerful method when the object-oriented paradigm is the preferred route. It’s definitely a concept everyone can use and should have under there belt. These concepts are used to form the building blocks of any scalable and maintainable piece of software.
With this basic intro to inheritance in python, you can go ahead and target real-world problem statements and see how well of a design you are able to think of.
Recommended Articles
This is a guide to Inheritance in Python. Here we discuss the Introduction, Syntax, and types of Inheritance in Python along with different examples and its code implementation. You can also go through our other suggested articles –