Наследование позволяет создавать новый класс на основе уже существующего класса. Наряду с инкапсуляцией наследование является одним из краеугольных камней объектно-ориентированного дизайна.
Ключевыми понятиями наследования являются подкласс и суперкласс. Подкласс наследует от суперкласса все публичные атрибуты и методы. Суперкласс еще называется базовым (base class) или родительским (parent class), а подкласс — производным (derived class) или дочерним (child class).
Синтаксис для наследования классов выглядит следующим образом:
class подкласс (суперкласс): методы_подкласса
Например, в прошлых темах был создан класс Person, который представляет человека. Предположим, нам необходим класс работника, который работает на некотором предприятии. Мы могли бы создать с нуля новый класс, к примеру, класс Employee. Однако он может иметь те же атрибуты и методы, что и класс Person, так как сотрудник — это человек. Поэтому нет смысла определять в классе Employee тот же функционал, что и в классе Person. И в этом случае лучше применить наследование.
Итак, унаследуем класс Employee от класса Person:
class Person: def __init__(self, name, age): self.__name = name # устанавливаем имя self.__age = age # устанавливаем возраст @property def age(self): return self.__age @age.setter def age(self, age): if age in range(1, 100): self.__age = age else: print("Недопустимый возраст") @property def 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 = 33 tom.display_info()
Класс Employee полностью перенимает функционал класса Person и в дополнении к нему добавляет метод details()
.
Стоит обратить внимание, что для Employee доступны через ключевое слово self все методы и атрибуты класса Person, кроме закрытых атрибутов типа __name или __age.
При создании объекта Employee мы фактически используем конструктор класса Person. И кроме того, у этого объекта мы можем вызвать все методы класса Person.