Функция super() в Python: переопределение методов
В этом уроке вы узнаете, как использовать метод super() в Python для делегирования родительскому классу при переопределении методов.
- Знакомство с методом super() в Python
- super().__init__()
- Делегирование другим методам родительского класса
Знакомство с методом 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