На этом шаге мы рассмотрим особенности наследования.
Наследование является, пожалуй, самым главным понятием ООП. Предположим, у нас есть класс (например, Сlass1). При помощи наследования мы можем создать новый класс (например, Class2), в котором будет реализован доступ ко всем атрибутам и методам класса Class1:
class Class1: # Базовый класс def func1(self): print ("Метод func1() класса Class1") def func2(self): print ("Метод func2() класса Class1") class Class2 (Class1): # Класс Class2 наследует класс Ciass1 def func3(self): print ("Метод func3() класса Class2") c = Class2() # Создаем экземпляр класса Class2 c.func1() # Выведет: Метод func1() класса Ciass1 c.func2() # Выведет: Метод func2() класса Ciass1 c.func3() # Выведет: Метод func3() класса Ciass1
Результат работы приложения:
Метод func1() класса Class1
Метод func2() класса Class1
Метод func3() класса Class2
Как видно из примера, класс Class1 указывается внутри круглых скобок в определении класса Class2. Таким образом, класс Class2 наследует все атрибуты и методы класса Class1. Класс Class1 называется базовым или суперклассом, а класс Class2 - производным или подклассом.
Если имя метода в классе Class2 совпадает с именем метода класса Class1, то будет использоваться метод из класса Class2. Чтобы вызвать одноименный метод из базового класса, следует указать перед методом название базового класса. Кроме того, в первом параметре метода необходимо явно указать ссылку на экземпляр класса. Рассмотрим это на следующем примере:
class Class1: # Базовый класс def __init__(self): print ("Конструктор базового класса") def func1(self): print ("Метод func1() класса Class1") class Class2 (Class1): # Класс Class2 наследует класс Ciass1 def __init__(self): print ("Конструктор производного класса") Class1.__init__(self) # Вызываем конструктор базового класса def func1(self): print ("Метод func1() класса Class2") Class1.func1(self) # Вызываем метод базового класса c = Class2() # Создаем экземпляр класса Class2 c.func1() # Вызываем метод func1()
Результат работы приложения:
Конструктор производного класса
Конструктор базового класса
Метод func1() класса Class2
Метод func1() класса Class1
Чтобы вызвать одноименный метод из базового класса, можно также воспользоваться функцией super (). Формат функции:
super([<Класс>, <Указатель self>])
С помощью функции super () инструкцию
Class1.__init__(self) # Вызываем конструктор базового класса
super().__init__() # Вызываем конструктор базового класса
super (Class2, self).__init__() # Вызываем конструктор базового класса
Обратите внимание на то, что при использовании функции super () не нужно явно передавать указатель self в вызываемый метод. Кроме того, в первом параметре функции super () указывается производный класс, а не базовый. Поиск идентификатора будет производиться во всех базовых классах. Результатом поиска станет первый найденный идентификатор в цепочке наследования.
На следующем шаге мы рассмотрим множественное наследование.