Какие типы наследования существуют в Python

Ответ

В Python, как в объектно-ориентированном языке, существует несколько типов наследования, которые позволяют создавать иерархии классов и переиспользовать код.

  1. Одиночное наследование (Single Inheritance) Класс-потомок наследует атрибуты и методы от одного родительского класса. Это самая простая и распространенная форма наследования.

    class Vehicle:
        def move(self):
            print("Moving...")
    
    class Car(Vehicle):
        pass
    
    my_car = Car()
    my_car.move()  # Вывод: Moving...
  2. Множественное наследование (Multiple Inheritance) Класс может наследоваться от нескольких родительских классов, объединяя их функциональность. Порядок родительских классов в определении важен, так как он влияет на порядок разрешения методов (MRO).

    class Engine:
        def start(self):
            print("Engine started")
    
    class Radio:
        def play_music(self):
            print("Playing music")
    
    class Car(Engine, Radio):
        pass
    
    my_car = Car()
    my_car.start()       # Вывод: Engine started
    my_car.play_music()  # Вывод: Playing music
  3. Многоуровневое наследование (Multilevel Inheritance) Создается цепочка наследования: класс C наследуется от B, который, в свою очередь, наследуется от A.

    class A:
        def method_a(self):
            print("Method A")
    
    class B(A):
        def method_b(self):
            print("Method B")
    
    class C(B):
        pass
    
    instance_c = C()
    instance_c.method_a() # Доступен из класса A
    instance_c.method_b() # Доступен из класса B
  4. Иерархическое наследование (Hierarchical Inheritance) Несколько дочерних классов наследуются от одного родительского класса.

    class Animal:
        def speak(self):
            pass
    
    class Dog(Animal):
        def speak(self):
            return "Woof!"
    
    class Cat(Animal):
        def speak(self):
            return "Meow!"

Порядок разрешения методов (MRO)

При наследовании, особенно множественном, Python использует алгоритм C3-линеаризации для определения порядка, в котором будут искаться методы в иерархии классов. Этот порядок можно посмотреть с помощью атрибута __mro__.

print(Car.__mro__)
# (<class '__main__.Car'>, <class '__main__.Engine'>, <class '__main__.Radio'>, <class 'object'>)