Python Inheritance Tutorial- Method Overloading & Method Overriding

Python course with 57 real-time projects - Learn Python

In this Python tutorial, we talk about Python inheritance and types of inheritance in python with their syntax.

Moreover, we will study Python super function, Python method overriding and Python method overloading.

So, let’s start the Python Inheritance Tutorial.

Python Inheritance

Python Inheritance Tutorial- Method Overloading & Method Overriding

What is Inheritance in Python?

It is a universal fact that every student is a person. This is in hindsight of non-human students if any. To depict this relationship, we take an illustration.

Python Inheritance

Python Inheritance – Illustration

The relationship from person to a student is termed ‘Specialization’. Conversely, every student is a person, this is called Generalization.

In this representation, we use an arrow towards the base class as a UML (Unified Modeling Language) convention.

Here, Person can be called any of the following:

  • Super Class
  • Parent Class
  • Base Class

Likewise, Student here is:

  • Sub Class
  • Child Class
  • Derived Class

Python Inheritance Syntax

To make a class inherit from another, we apply the name of the base class in parentheses to the derived class’ definition.

>>> class Person:
                pass
>>> class Student(Person):
                pass
>>> issubclass(Student,Person)

Output

True

Here, class Student inherits from class Person. Here, since we only want to focus on the python syntax, we use the ‘pass’ statement in the bodies of the classes.

Also, we use the function issubclass() to confirm that student is a subclass of person.

Types of Inheritance in Python

There are five types of inheritance in python, we observe.

Python Inheritance - Types

Types of Python Inheritance

1. Single Inheritance in Python

A single Python inheritance is when a single class inherits from a class.

>>> x=0
>>> class fruit:
                def __init__(self):
                                global x
                                x+=1
                                print("I'm a fruit")                          
>>> class citrus(fruit):
                def __init__(self):
                                super().__init__()
                                global x
                                x+=2
                                print("I'm citrus")                           
>>> x
>>> lime=citrus()

Output

I’m a fruit
I’m citrus
>>> x

Output

3

2. Python Multiple Inheritance

Multiple Python inheritance are when a class inherits from multiple base classes.

>>> class Color:
                pass
>>> class Fruit:
                pass
>>> class Orange(Color,Fruit):
                pass
>>> issubclass(Orange,Color) and issubclass(Orange,Fruit)

Output

True

3. Multilevel Inheritance in Python

When one class inherits from another, which in turn inherits from another, it is multilevel python inheritance.

>>> class A:
                x=1         
>>> class B(A):
                pass
>>> class C(B):
                pass
>>> cobj=C()
>>> cobj.x

Output

1

4. Hierarchical Inheritance in Python

When more than one class inherits from a class, it is hierarchical Python inheritance.

>>> class A:
                pass
>>> class B(A):
                pass
>>> class C(A):
                pass
>>> issubclass(B,A) and issubclass(C,A)

Output

True

5. Hybrid Inheritance in Python

Hybrid Python inheritance is a combination of any two kinds of inheritance.

>>> class A:
                x=1       
>>> class B(A):
                pass
>>> class C(A):
                pass
>>> class D(B,C):
                pass
>>> dobj=D()
>>> dobj.x

Output

1

Python Inheritance Super Function – Super()

With inheritance, the super() function in python actually comes in quite handy. It allows us to call a method from the parent class.

Let’s define a new class for this.

>>> class Vehicle:
                def start(self):
                                print("Starting engine")
                def stop(self):
                                print("Stopping engine")                            
>>> class TwoWheeler(Vehicle):
                def say(self):
                                super().start()
                                print("I have two wheels")
                                super().stop()                            
>>> Pulsar=TwoWheeler()
>>> Pulsar.say()

Output

Starting engine
I have two wheels
Stopping engine

Python Override Method

A subclass may change the functionality of a Python method in the superclass. It does so by redefining it.

This is termed python method overriding. Lets see this Python Method Overriding Example.

>>> class A:
                def sayhi(self):
                                print("I'm in A")                          
>>> class B(A):
                def sayhi(self):
                                print("I'm in B")                             
>>> bobj=B()
>>> bobj.sayhi()

Output

I’m in B

Python Method Overloading

Before we say anything, we’d like you to take a look at the following code:

>>> def add(a,b):
      return a+b
>>> def add(a,b,c):
      return a+b+c
>>> add(2,3)

Output

Traceback (most recent call last):
File “<pyshell#8>”, line 1, in <module>
add(2,3)
TypeError: add() missing 1 required positional argument: ‘c’

What looks like overloading methods, it is actually that Python keeps only the latest definition of a method you declare to it.

This code doesn’t make a call to the version of add() that takes in two arguments to add. So we find it safe to say Python doesn’t support method overloading.

However, we recently ran into a rather Pythonic way to make this happen. Check this out:

>>> def add(instanceOf,*args):
      if instanceOf=='int':
              result=0
      if instanceOf=='str':
              result=''
      for i in args:
              result+=i
      return result

In this code, not only do we use the *args magic variable for variable arity, we also let the code deal with both integers and strings.

Watch it happen:

>>> add('int',3,4,5)

Output

12

>>> add('str','I ','speak ','Python')

Output

‘I speak Python’

You say what if I do this?:

>>> def add(a,b,c=0):

Output

return a+b+c

>>> add(2,3)

Output

5

To that, we’ll say this isn’t method overloading, this is simply used of default arguments.

Python Interview Questions on Inheritance

  1. How does inheritance work in Python?
  2. What are the types of inheritance in Python?
  3. Does Python support multiple inheritance?
  4. What is Python inheritance? Explain with example.
  5. Is hierarchical inheritance possible in Python?

Conclusion

Of all things good, Python inheritance saves us time, effort, and memory.

In this tutorial, we looked at Python inheritance syntax, inheritance types, Python method overloading, method overriding in python and python super functions.

Tell us in a comment box, if something is missing.

Your 15 seconds will encourage us to work even harder
Please share your happy experience on Google

follow dataflair on YouTube

14 Responses

  1. Varun says:

    Update your programs for Python 3. Lot of which are not running, so not able to understand your examples clearly.

    • Veeresh says:

      Hi Varun,
      I feel you are just copy and pasting the code. Please Intend the codes appropriately it will work.
      Thanks,
      Veeresh

    • Data Flair says:

      “Hi, Varun
      Any piece of code on this blog “Python Inheritance” should work fine with Python 3.x. Have you checked your indentation once?
      Since Python does not mandate use of curly braces, indentation is a must.
      Read up on Python Syntax – you will need to indent the statements under one block to the same number of tabs and/or spaces.
      You could also check if you are indeed working on Python 3.x.”

  2. Py_dev says:

    Method overloading is not supported in python. In this example, you are calling the same function/method with some default values. If we have more than on method with the same name, only the latest one is considered.

    • DataFlair Team says:

      Hi Py_dev,
      Thanks for connecting DataFlair.

      Before we say anything, we’d like you to take a look at the following code:
      >>> def add(a,b):
      return a+b

      >>> def add(a,b,c):
      return a+b+c

      >>> add(2,3)
      Traceback (most recent call last):
      File “”””, line 1, in
      add(2,3)
      TypeError: add() missing 1 required positional argument: ‘c’

      What looks like overloading methods, it is actually that Python keeps only the latest definition of a method you declare to it. This code doesn’t make a call to the version of add() that takes in two arguments to add. So we find it safe to say Python doesn’t support method overloading. However, we recently ran into a rather Pythonic way to make this happen. Check this out:
      >>> def add(instanceOf,*args):
      if instanceOf==’int’:
      result=0
      if instanceOf==’str’:
      result=”
      for i in args:
      result+=i
      return result

      In this code, not only do we use the *args magic variable for variable arity, we also let the code deal with both integers and strings. Watch it happen:
      >>> add(‘int’,3,4,5)
      12
      >>> add(‘str’,’I ‘,’speak ‘,’Python’)
      ‘I speak Python’

      You say what if I do this?:
      >>> def add(a,b,c=0):
      return a+b+c

      >>> add(2,3)
      5
      To that, we’ll say this isn’t method overloading, this is simply used of default arguments.

  3. vinod says:

    can we restrict a base class to not to inherit by the child class?

    • DataFlair Team says:

      Greetings, Vinod

      Thanks for commenting on “Python Inheritance”. Final classes are not Pythonic. What we mean to say is- this is not something Python intends to make possible and there is no keyword for this.
      The flag Py_TPFLAGS_BASETYPE is something we can set via the C API to decide which classes we can subclass.
      When this bit is clear, it means it isn’t possible to subtype this class. This is like final classes in Java.

      However, it is also possible to emulate this behavior using nothing but Python:

      >>> class Final(type):
      def __new__(cls, name, bases, classdict):
      for b in bases:
      if isinstance(b, Final):
      raise TypeError(“type ‘{0}’ is not an acceptable base type”.format(b.__name__))
      return type.__new__(cls, name, bases, dict(classdict))

      >>> class C(metaclass=Final): pass

      >>> class D(C): pass

      Traceback (most recent call last):
      File “”, line 1, in
      class D(C): pass
      File “”, line 5, in __new__
      raise TypeError(“type ‘{0}’ is not an acceptable base type”.format(b.__name__))
      TypeError: type ‘C’ is not an acceptable base type

      Hope you understood.
      Regards,
      DataFlair

  4. Rishabh Agrawal says:

    The ‘return result’ statement in the last program (args one) should be written without indentation. Otherwise the function ‘add’ will return in the first iteration itself.

    • DataFlair Team says:

      Thank you for noticing, people like you help improve the experience for other users. We have made necessary changes in this Python Inheritance. Please refer our other Python tutorials.
      Regards,
      DataFlair

  5. Amol says:

    Hello,

    Am’I missing something here?? getting this following error:
    UnboundLocalError: local variable ‘result’ referenced before assignment

    • DataFlair Team says:

      Hi Amol,
      Thanks for connecting DataFlair through this “Python Inheritance” Tutorial. Here, the error tells you that you have tried to access ‘result’ without first assigning it.
      You could have put ‘result’ instead of ‘result=0’ or any of the assignment statements under the if-conditions.
      Hope, it helps you!

  6. Basavaraj says:

    This tutorial is awesome. Well structured. Easy to learn and understand. Thank you. Great work. If you don’t mind, consider this one thing that example codes should have indentation so that beginner shouldn’t struggle to read the code. Python IDLE is okay upto variables. After that, example codes will be long. it is better code should have indentation.

  7. Arun says:

    In Case of Multiple Inheritance, how to inherit both the __init__methods of parent classes (say: A and B are both parent class) into a child class (say : c as child class inheriting from both A and B), using super().__init__() method.

    • DataFlair says:

      You can call A’s init method using “A.__init__(self)” abd B’s init method using “B.__init__(self)” inside C’s init method.

Leave a Reply

Your email address will not be published. Required fields are marked *