Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Множественное наследование в Python

Множественное наследование в Python

В определенных классах в круглых скобках можно указать сразу несколько базовых классов через запятую. В этом случае поиск идентификаторов производится вначале в производном классе, затем в базовом классе, расположенном первым в списке, далее просматриваются все базовые классы базового класса. Только после этого просматривается базовый класс, расположенный в списке правее, и все его базовые классы. Список базовых классов просматривается слева направо. Результатом поиска будет первый найденный идентификатор. Рассмотрим множественное наследование на примере.

Множественное наследование

class Class1:         # Базовый класс для класса Class2
    def f_func1(self):
        print "Метод f_func1() класса Class1"
 
class Class2(Class1): # Класс Class2 наследует класс Class1
    def f_func2(self):
        print "Метод f_func2() класса Class2"
 
class Class3(Class1): # Класс Class3 наследует класс Class1
    def f_func1(self):
        print "Метод f_func1() класса Class3"
    def f_func2(self):
        print "Метод f_func2() класса Class3"
    def f_func3(self):
        print "Метод f_func3() класса Class3"
    def f_func4(self):
        print "Метод f_func4() класса Class3"
 
class Class4(Class2, Class3): # Множественное наследование
    def f_func4(self):
        print "Метод f_func4() класса Class4"
 
c1 = Class4()             # Создаем экземпляр класса Class4
c1.f_func1()              # Выведет: Метод f_func1() класса Class1
c1.f_func2()              # Выведет: Метод f_func2() класса Class2
c1.f_func3()              # Выведет: Метод f_func3() класса Class3
c1.f_func4()              # Выведет: Метод f_func4() класса Class4

HP DesignJet 1055 Итак, метод f_func1() определен в двух классах - Class1 и Class3. Так как класс Class2 стоит первым в списке базовых классов, вначале просматривается этот класс, а затем все его базовые классы. Поэтому метод f_func1() будет найден в классе Class1, а не в классе Class3.

Метод f_func2() также определен в двух классах - Class2 и Class3. Так как класс Class2 стоит первым в списке базовых классов, то метод будет найден именно в этом классе. Чтобы наследовать метод из класса Class3, следует указать это явным образом. Передаем определение класса Class4 из предыдущего примера и наследуем метод f_func2() из класса Class3.

Указание класса при наследовании метода

class Class4(Class2, Class3): # Множественное наследование
    # Наследуем f_func2() из класса Class3, а не из класса Class2
    f_func2 = Class3.f_func2
    def f_func4(self):
        print "Метод f_func4() класса Class4"

Метод f_func3() определен только в классе Class3, поэтому метод наследуется от этого класса. Метод f_func4(), определенный в классе Class3, переопределяется в производном классе. Если метод найден в производном классе, то вся иерархия наследования просматривается не будет.

Если необходимо получить перечень базовых классов, то можно воспользоваться атрибутом __base__. В качестве значения атрибут возвращает кортеж. В качестве примера выведем классы для класса Class4 из предыдущего примера.

print Class4.__bases__

Выведет:

(, )
Комментариев: 5
  1. > Метод f_func2() также определен в двух классах - Class2 и Class2.

    ошибочка. должно быть "Class2 и Class3"

  2. ViT, спасибо! быстренько исправил.

  3. Только вот пример-то для Python 2, а не Python 3. В 3-ке вывод был бы следующим:

    Метод f_func1() класса Class3

    Метод f_func2() класса Class2

    Метод f_func3() класса Class3

    Метод f_func4() класса Class4

  4. print Class4.__bases__

    Должен выдавать не пустой кортеж, а (, )

  5. А, видимо, косяк на сайте.

    Еще одна попытка

    class '__main__.Class2'>,