Tutorial

Python super() - Python 3 super()

Published on August 3, 2022
Default avatar

By Pankaj

Python super() - Python 3 super()

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Python super() function allows us to refer to the parent class explicitly. It’s useful in case of inheritance where we want to call super class functions.

Python super

To understand about python super function, you have to know about Python Inheritance. In Python Inheritance, the subclasses inherit from the superclass. Python super() function allows us to refer the superclass implicitly. So, Python super makes our task easier and comfortable. While referring the superclass from the subclass, we don’t need to write the name of superclass explicitly. In the following sections, we will discuss python super function.

Python super function example

At first, just look at the following code we used in our Python Inheritance tutorial. In that example code, the superclass was Person and the subclass was Student. So the code is shown below.

class Person:
    # initializing the variables
    name = ""
    age = 0

    # defining constructor
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        # defining class methods

    def show_name(self):
        print(self.name)

    def show_age(self):
        print(self.age)


# definition of subclass starts here
class Student(Person):
    studentId = ""

    def __init__(self, student_name, student_age, student_id):
        Person.__init__(self, student_name, student_age)
        self.studentId = student_id

    def get_id(self):
        return self.studentId  # returns the value of student id


# end of subclass definition


# Create an object of the superclass
person1 = Person("Richard", 23)
# call member methods of the objects
person1.show_age()
# Create an object of the subclass
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

In the above example, we have called parent class function as:

Person.__init__(self, student_name, student_age) 

We can replace this with python super function call as below.

super().__init__(student_name, student_age)

The output will remain the same in both the cases, as shown in the below image. python super, python 3 super

Python 3 super

Note that the above syntax is for python 3 super function. If you are on python 2.x versions, then it’s slightly different and you will have to do the following changes:

class Person(object):
...
        super(Student, self).__init__(student_name, student_age)

The first change is to have object as the base class for Person. It’s required to use the super function in Python 2.x versions. Otherwise, you will get the following error.

Traceback (most recent call last):
  File "super_example.py", line 40, in <module>
    student1 = Student("Max", 22, "102")
  File "super_example.py", line 25, in __init__
    super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj

The second change in the syntax of the super function itself. As you can see that python 3 super function is a lot easier to use and the syntax is also clean looking.

Python super function with multilevel inheritance

As we have stated previously that Python super() function allows us to refer the superclass implicitly. But in the case of multi-level inheritances which class will it refer? Well, Python super() will always refer the immediate superclass. Also Python super() function not only can refer the __init__() function but also can call all other function of the superclass. So, in the following example, we will see that.

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1)

Let’s see the output of above python 3 super example with multi-level inheritance.

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

So, from the output we can clearly see that the __init__() function of class C had been called at first, then class B and after that class A. Similar thing happened by calling sub_method() function.

Why do we need Python super function

If you have previous experience in Java language, then you should know that the base class is also called by a super object there. So, this concept is actually useful for the coders. However, Python also keeps the facility for the programmer to use superclass name to refer them. And, if your program contains multi-level inheritance, then this super() function is helpful for you. So, that’s all about python super function. Hopefully, you understood this topic. Please use the comment box for any query.

You can checkout complete python script and more Python examples from our GitHub Repository.

Reference: Official Documentation

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar
Pankaj

author

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
November 6, 2021

Greetings, Please revisit your example code on page: https://www.journaldev.com/15911/python-super i.e., your definition of class Person uses class scope variable definitions that are not subsequently used. class Person: # initializing the variables name = “” <<<<<this is class scope age = 0 <<<<<this is class scope The same is true for class student: class Student(Person): studentId = “” <<<<<this is class scope cheers!

- Robert Cox

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    August 29, 2021

    Hi, Can you explain the submethod execution flow Printing from class C: 1 Printing from class B: 2 Printing from class A: 3 if the submethod of C is executing first, Output should be : Printing from class C: 1 Since def sub_method(self, b): print(‘Printing from class C:’, b) super().sub_method(b + 1) Plzz Explain

    - Ajay

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      December 16, 2020

      This is such a neat and easy-to-follow explanation. Thank you!

      - Anupam

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        October 7, 2020

        why this is not working class FrameApp(Frame): def __init__(self,master): super(FrameApp,self).__init__(master)

        - klenexb

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          December 2, 2019

          Person.__init__(self, student_name, student_age) super().__init__(student_name, student_age) calling parent class using ‘super()’, no need to specify ‘self’. Please explain the reason.

          - Arun

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            February 4, 2019

            Whenever I use super().__init__( *args ) I’m greeted with the error TypeError: object.__init__() takes no parameters. Please help. I need to know why this happens and how to prevent it.

            - Seth

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              December 18, 2018

              what a clear presentation

              - eric0109

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                December 5, 2018

                That’s not multiple inheritance - that’s multiple levels of inheritance. Multiple inheritance is class C(A,B): pass

                - Gah

                  Try DigitalOcean for free

                  Click below to sign up and get $200 of credit to try our products over 60 days!

                  Sign up

                  Join the Tech Talk
                  Success! Thank you! Please check your email for further details.

                  Please complete your information!

                  Get our biweekly newsletter

                  Sign up for Infrastructure as a Newsletter.

                  Hollie's Hub for Good

                  Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

                  Become a contributor

                  Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                  Welcome to the developer cloud

                  DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

                  Learn more
                  DigitalOcean Cloud Control Panel