Python super

Created with Sketch.

Python super

Summary: in this tutorial, you will learn how to use the Python super() to delegate to the parent class when overriding methods.

Introduction to the Python super

First, define an Employee class:

class Employee:
def __init__(self, name, base_pay, bonus):
self.name = name
self.base_pay = base_pay
self.bonus = bonus

def get_pay(self):
return self.base_pay + self.bonus

Code language: Python (python)

The Employee class has three instance variables name, base_pay, and bonus. It also has the get_pay() method that returns the total of base_pay and bonus.

Second, define the SalesEmployee class that inherits from the Employee class:

class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
self.name = name
self.base_pay = base_pay
self.bonus = bonus
self.sales_incentive = sales_incentive

def get_pay(self):
return self.base_pay + self.bonus + self.sales_incentive

Code language: Python (python)

The SalesEmployee class has four instance variables name, base_pay, bonus, and sales_incentive. It has the get_pay() method that overrides the get_pay() method in the Employee class.

super().__init__()

The __init__() method of the SalesEmployee class has some parts that are the same as the ones in the __init__() method of the Employee class.

To avoid duplication, you can call the __init__() method of Employee class from the __init__() method of the SalesEmployee class.

To reference the Employee class in the SalesEmployee class, you use the super(). The super() returns a reference of the parent class from a child class.

The following redefines the SalesEmployee class that uses the super() to call the __init__() method of the Employee class:

class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
super().__init__(name, base_pay, bonus)
self.sales_incentive = sales_incentive

def get_pay(self):
return self.base_pay + self.bonus + self.sales_incentive

Code language: Python (python)

When you create an instance of the SalesEmployee class, Python will execute the __init__() method in the SalesEmployee class. In turn, this __init__() method calls the __init__() method of the Employee class to initialize the name, base_pay, and bonus.

Delegating to other methods in the parent class

The get_pay() method of the SalesEmployee class has some logic that is already defined in the get_pay() method of the Employee class. Therefore, you can reuse this logic in the get_pay() method of the SalesEmployee class.

To do that, you can call the get_pay() method of the Employee class in the get_pay() method of SalesEmployee class as follows:

class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
super().__init__(name, base_pay, bonus)
self.sales_incentive = sales_incentive

def get_pay(self):
return super().get_pay() + self.sales_incentive

Code language: Python (python)

The following calls the get_pay() method of the Employee class from the get_pay() method in the SalesEmployee class:

super().get_pay()

Code language: Python (python)

When you call the get_pay() method from an instance of the SalesEmployee class, it calls the get_pay() method from the parent class (Employee) and return the sum of the result of the super().get_pay() method with the sales_incentive.

Put it all together

The following shows the complete code:

class Employee:
def __init__(self, name, base_pay, bonus):
self.name = name
self.base_pay = base_pay
self.bonus = bonus

def get_pay(self):
return self.base_pay + self.bonus

class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
super().__init__(name, base_pay, bonus)
self.sales_incentive = sales_incentive

def get_pay(self):
return super().get_pay() + self.sales_incentive

if __name__ == '__main__':
sales_employee = SalesEmployee('John', 5000, 1000, 2000)
print(sales_employee.get_pay()) # 8000

Code language: Python (python)

Summary

  • Use super() to call the methods of a parent class from a child class.

Leave a Reply

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