Перейти к основному содержимому

Наследование в Python

Благодаря наследованию один класс может перенять все методы и свойства другого класса.

Класс, который их передаёт, — это родительский класс, иногда его называют базовым классом.

Класс, который их получает, — это дочерний класс, также известный как производный класс.


Создание родительского класса

Родительскому классу не нужен особый синтаксис. Вы пишете его как любой другой класс, и эту роль может выполнять любой класс:

Пример

Person хранит свойства firstname и lastname и предоставляет метод printname:

Prompt
Напишите на Python класс Person со свойствами firstname и lastname и методом printname. Создайте объект Person и вызовите printname.
Вывод: полная программа на Python

Создание дочернего класса

Чтобы создать дочерний класс, укажите имя родителя в скобках после имени нового класса, и функциональность родителя перейдёт к нему:

Примечание: pass пишут, когда классу не нужно ничего своего, кроме унаследованного.

В результате у Student оказываются все свойства и методы, которые есть у Person.

Пример

Student получает свои свойства и методы от класса Person:

Prompt
Напишите на Python класс Student, который наследует от Person с помощью pass. Создайте объект Student и вызовите унаследованный метод printname.
Вывод: полная программа на Python
main.py
class Student(Person):
  pass

Добавление функции __init__()

Пока наш дочерний класс просто получает всё от родителя.

Теперь замените ключевое слово pass собственной функцией __init__().

Примечание: Python сам вызывает __init__() каждый раз, когда класс создаёт новый объект.

Но есть нюанс: дочерний класс с собственной __init__() перестаёт наследовать версию родителя.

Примечание: __init__() дочернего класса переопределяет ту функцию, которую он унаследовал бы от родителя.

Чтобы вернуть поведение родителя, вызовите __init__() родителя внутри такой же функции дочернего класса:

Теперь у дочернего класса есть собственная __init__(), и при этом он сохраняет то, что предоставляет родитель, так что в него можно добавлять новую функциональность.

Пример

Prompt
Напишите на Python дочерний класс Student, который вызывает init родительского класса Person с помощью Person.init().
Вывод: полная программа на Python
main.py
class Student(Person):
  def __init__(self, fname, lname):
    #add properties etc.

Использование функции super()

Встроенная функция super() — ещё один способ обратиться к родителю из дочернего класса:

Поскольку super() находит родителя за вас, имя родителя вообще не нужно указывать в вызове, а его методы и свойства всё равно остаются вам доступны.

Пример

Prompt
Напишите на Python дочерний класс Student, который использует super().init() для наследования от Person.
Вывод: полная программа на Python

Добавление свойств

Год выпуска, например 2019, не стоит записывать прямо в классе. Это должна быть переменная, которая передаётся в Student при каждом создании объекта-студента, а для этого нужен ещё один параметр __init__():

Пример

Добавьте параметр year и передавайте нужное значение при создании каждого объекта:

Prompt
Напишите на Python класс Student, наследующий от Person, и добавьте свойство graduationyear. Создайте объект Student с годом 2019.
Вывод: полная программа на Python

Добавление методов

У дочерних классов могут быть собственные методы. Учтите одну вещь: метод дочернего класса с тем же именем, что и функция родителя, переопределяет унаследованную.

Пример

Добавьте в класс Student метод welcome:

Prompt
Напишите на Python класс Student, наследующий от Person, с методом welcome, который выводит приветствие с graduationyear.
Вывод: полная программа на Python