Функция super() в Python: переопределение методов

В этом уроке вы узнаете, как использовать метод super() в Python для делегирования родительскому классу при переопределении методов.

Содержание

Знакомство с методом super() в Python

Сначала определите класс Employee:

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

Класс Employee имеет три переменных экземпляра: name, base_pay и bonus. Он также имеет метод get_pay(), который возвращает общую сумму base_pay и bonus.

Затем нужно определить класс SalesEmployee, который наследуется от класса Employee:

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

Класс SalesEmployee имеет четыре переменных экземпляра: name, base_pay, bonus и sales_incentive. Он имеет метод get_pay(), который переопределяет метод get_pay() в классе Employee.

super().__init__()

Метод __init__() класса SalesEmployee имеет некоторые части, такие же, как и в методе __init__() класса Employee.

Чтобы избежать дублирования, вы можете вызвать метод __init__() класса Employee из метода __init__() класса SalesEmployee.

Чтобы ссылаться на класс «Employee» в классе «SalesEmployee», используйте метод super(). Super() возвращает ссылку родительского класса из дочернего класса.

Следующий код переопределяет класс SalesEmployee, который использует super() для вызова метода __init__() класса Employee:

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

Когда вы создаете экземпляр класса SalesEmployee, Python выполнит метод __init__() в классе SalesEmployee. В свою очередь, этот метод __init__() вызывает метод __init__() класса Employee для инициализации name, base_pay и bonus.

Делегирование другим методам родительского класса

Метод get_pay() класса SalesEmployee имеет некоторую логику, которая уже определена в методе get_pay() класса Employee. Поэтому вы можете повторно использовать эту логику в методе get_pay() класса SalesEmployee.

Для этого вы можете вызвать метод get_pay() класса Employee в методе get_pay() класса SalesEmployee следующим образом:

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

Следующий код вызывает метод get_pay() класса Employee из метода get_pay() класса SalesEmployee:

super().get_pay()

Когда вы вызываете метод get_pay() из экземпляра класса SalesEmployee, он вызывает метод get_pay() из родительского класса (Employee) и возвращает сумму результата метода super().get_pay() с параметром sales_incentive.

Ниже показан полный код:

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

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *