Наследование позволяет создавать новый класс на основе уже существующего класса. Наряду с инкапсуляцией наследование является одним из краеугольных камней объектно-ориентированного дизайна.
Ключевыми понятиями наследования являются подкласс и суперкласс. Подкласс наследует от суперкласса все публичные атрибуты и методы. Суперкласс еще называется базовым (base class) или родительским (parent class), а подкласс — производным (derived class) или дочерним (child class).
Синтаксис для наследования классов выглядит следующим образом:
| 1 2 | class подкласс (суперкласс):методы_подкласса |
Например, в прошлых темах был создан класс Person, который представляет человека. Предположим, нам необходим класс работника, который работает на некотором предприятии. Мы могли бы создать с нуля новый класс, к примеру, класс Employee. Однако он может иметь те же атрибуты и методы, что и класс Person, так как сотрудник — это человек. Поэтому нет смысла определять в классе Employee тот же функционал, что и в классе Person. И в этом случае лучше применить наследование.
Итак, унаследуем класс Employee от класса Person:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class Person:def __init__(self, name, age):self.__name = name # устанавливаем имяself.__age = age # устанавливаем возраст@propertydef age(self)return self.__age @age.setterdef age(self, age):if age in range(1, 100):self.__age = ageelse:print("Недопустимый возраст") @propertydef name(self):return self.__name def display_info(self):print("Имя:", self.__name, "\tВозраст:", self.__age)class Employee(Person):def details(self, company):# print(self.__name, "работает в компании", company) # так нельзя, self.__name - приватный атрибутprint(self.name, "работает в компании", company) tom = Employee("Tom", 23)tom.details("Google")tom.age = 33tom.display_info() |
Класс Employee полностью перенимает функционал класса Person и в дополнении к нему добавляет метод details().
Стоит обратить внимание, что для Employee доступны через ключевое слово self все методы и атрибуты класса Person, кроме закрытых атрибутов типа __name или __age.
При создании объекта Em