Найти в Дзене

День 81. Переопределение функционала базового класса.

Python . Переопределение функционала базового класса. В прошлый раз класс Employee полностью перенимал функционал класса Person: Но что, если мы хотим что-то изменить из этого функционала? Например, добавить работнику через конструктор, новый атрибут, который будет хранить компанию, где он работает или изменить реализацию метода display_info. Python позволяет переопределить функционал базового класса. Например, изменим классы следующим образом: Здесь в классе Employee добавляется новый атрибут – self.company, который хранит компанию работника. Соответственно метод __init__() принимает три параметра: второй для установки имени и третий для установки компании. Но если в базовом классе определен конструктор с помощью метода __init__, и мы хотим в производном классе изменить логику конструктора, то в конструкторе производного класса мы должны вызвать конструктор базового класса. То есть в конструкторе Employee надо вызвать конструктор класса Person. Для обращения к базовому классу использу

Python . Переопределение функционала базового класса.

В прошлый раз класс Employee полностью перенимал функционал класса Person:

-2

Но что, если мы хотим что-то изменить из этого функционала? Например, добавить работнику через конструктор, новый атрибут, который будет хранить компанию, где он работает или изменить реализацию метода display_info. Python позволяет переопределить функционал базового класса. Например, изменим классы следующим образом:

-3

Здесь в классе Employee добавляется новый атрибут – self.company, который хранит компанию работника. Соответственно метод __init__() принимает три параметра: второй для установки имени и третий для установки компании. Но если в базовом классе определен конструктор с помощью метода __init__, и мы хотим в производном классе изменить логику конструктора, то в конструкторе производного класса мы должны вызвать конструктор базового класса. То есть в конструкторе Employee надо вызвать конструктор класса Person. Для обращения к базовому классу используется выражение super(). Так, в конструкторе Employee выполняется вызов:

-4

Это выражение будет представлять вызов конструктора класса Person, в который передается имя работника. И это логично. Ведь имя работника устанавливается именно в конструкторе класса Person. В самом конструкторе Employee лишь устанавливаем свойство company. Кроме того, в классе Employee переопределяется метод display_info() – в него добавляется вывод компании работника. Причем мы могли определить этот метод следующим образом:

-5

Но тогда строка вывода имени повторяла бы код из класса Person. Если эта часть кода совпадает с методом из класса Person, то нет смысла повторяться, поэтому опять же с помощью выражения super() обращаемся к реализации метода display_info в классе Person:

-6

Затем мы можем вызвать конструктор Employee для создания объекта этого класса и вызвать метод display_info:

-7