Наследование в Python
Благодаря наследованию один класс может перенять все методы и свойства другого класса.
Класс, который их передаёт, — это родительский класс, иногда его называют базовым классом.
Класс, который их получает, — это дочерний класс, также известный как производный класс.
Создание родительского класса
Родительскому классу не нужен особый синтаксис. Вы пишете его как любой другой класс, и эту роль может выполнять любой класс:
Пример
Person хранит свойства firstname и lastname и предоставляет метод printname:
Вывод: полная программа на Python
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
#Используйте класс Person, чтобы создать объект, а затем вызовите метод printname:
x = Person("John", "Doe")
x.printname()
Создание дочернего класса
Чтобы создать дочерний класс, укажите имя родителя в скобках после имени нового класса, и функциональность родителя перейдёт к нему:
Примечание: pass пишут, когда классу не нужно ничего своего, кроме унаследованного.
В результате у Student оказываются все свойства и методы, которые есть у Person.
Пример
Student получает свои свойства и методы от класса Person:
Вывод: полная программа на Python
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
pass
x = Student("Mike", "Olsen")
x.printname()
class Student(Person):
pass
Добавление функции __init__()
Пока наш дочерний класс просто получает всё от родителя.
Теперь замените ключевое слово pass собственной функцией __init__().
Примечание: Python сам вызывает __init__() каждый раз, когда класс создаёт новый объект.
Но есть нюанс: дочерний класс с собственной __init__() перестаёт наследовать версию родителя.
Примечание: __init__() дочернего класса переопределяет ту функцию, которую он унаследовал бы от родителя.
Чтобы вернуть поведение родителя, вызовите __init__() родителя внутри такой же функции дочернего класса:
Теперь у дочернего класса есть собственная __init__(), и при этом он сохраняет то, что предоставляет родитель, так что в него можно добавлять новую функциональность.
Пример
Вывод: полная программа на Python
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname):
Person.__init__(self, fname, lname)
class Student(Person):
def __init__(self, fname, lname):
#add properties etc.
Использование функции super()
Встроенная функция super() — ещё один способ обратиться к родителю из дочернего класса:
Поскольку super() находит родителя за вас, имя родителя вообще не нужно указывать в вызове, а его методы и свойства всё равно остаются вам доступны.
Пример
Вывод: полная программа на Python
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname):
super().__init__(fname, lname)
Добавление свойств
Год выпуска, например 2019, не стоит записывать прямо в классе. Это должна быть переменная, которая передаётся в Student при каждом создании объекта-студента, а для этого нужен ещё один параметр __init__():
Пример
Добавьте параметр year и передавайте нужное значение при создании каждого объекта:
Вывод: полная программа на Python
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
x = Student("Mike", "Olsen", 2019)
Добавление методов
У дочерних классов могут быть собственные методы. Учтите одну вещь: метод дочернего класса с тем же именем, что и функция родителя, переопределяет унаследованную.
Пример
Добавьте в класс Student метод welcome:
Вывод: полная программа на Python
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
def welcome(self):
print("Добро пожаловать,", self.firstname, self.lastname, "— выпуск", self.graduationyear)