Шаг 137.
Основы языка Python.
Объектно-ориентированное программирование (ООП). Наследование

    На этом шаге мы рассмотрим особенности наследования.

    Наследование является, пожалуй, самым главным понятием ООП. Предположим, у нас есть класс (например, С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 () указывается производный класс, а не базовый. Поиск идентификатора будет производиться во всех базовых классах. Результатом поиска станет первый найденный идентификатор в цепочке наследования.


    Замечание. В последних версиях Python 2 существовало два типа классов: "классические" классы и классы нового стиля. Классы нового стиля должны были явно наследовать класс object. В Python 3 все классы являются классами нового стиля, но наследуют класс object неявно. Таким образом, все классы верхнего уровня являются наследниками этого класса, даже если он не указан в списке наследования. "Классические" классы (в понимании Python 2) в Python 3 больше не поддерживаются.

    На следующем шаге мы рассмотрим множественное наследование.




Предыдущий шаг Содержание Следующий шаг