В Python один клас може успадковуватися відразу від декількох батьківських класів. Це називається множинним успадкуванням. Дочірній клас може успадковувати не тільки батьківський клас, а й інший дочірній клас. Така форма спадкування відома як багаторівневе спадкування. Якщо два батьківських класи мають однакове ім’я методу і дочірній клас (який успадковує 2 батьківські класи) викликає цей метод, Python використовує MRO (порядок виклику методів) для виклику потрібного методу.
Множинне успадкування в Python
В Python один клас може успадковуватися відразу від декількох батьківських класів. Це називається множинним успадкуванням.
Наприклад, клас Bat є дочірнім від батьківських класів Mammal та WingedAnimal. Це має сенс, тому що кажан є як ссавцем, так і крилатою твариною.

Синтаксис множинного успадкування в Python:
|
1 2 3 4 5 6 7 8 |
class SuperClass1: # Дані класу SuperClass1 class SuperClass2: # Дані класу SuperClass2 class MultiDerived(SuperClass1, SuperClass2): # Дані класів SuperClass1 + SuperClass2 + MultiDerived |
Тут клас MultiDerived є дочірнім від класів SuperClass1 та SuperClass2.
Розглянемо приклад на практиці:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Mammal: def mammal_info(self): print("Mammals can give direct birth.") class WingedAnimal: def winged_animal_info(self): print("Winged animals can flap.") class Bat(Mammal, WingedAnimal): pass # Створюємо об'єкт класу Bat b1 = Bat() b1.mammal_info() b1.winged_animal_info() |
Результат:
Mammals can give direct birth.
Winged animals can flap.
Тут клас Bat є дочірнім від двох батьківських класів: Mammal та WingedAnimal. Зверніть увагу на наступні рядки коду:
|
1 2 3 |
b1 = Bat() b1.mammal_info() b1.winged_animal_info() |
Тут ми використовуємо b1 (об’єкт класу Bat) для доступу до методів mammal_info() і winged_animal_info() класів Mammal та WingedAnimal відповідно.
Багаторівневе спадкування в Python
В Python дочірній клас може успадковувати не лише батьківський клас, а й інший дочірній клас. Така форма спадкування відома як багаторівневе спадкування.
Синтаксис багаторівневого спадкування в Python:
|
1 2 3 4 5 6 7 8 |
class SuperClass: # Код батьківського класу class DerivedClass1(SuperClass): # Код дочірнього класу 1 class DerivedClass2(DerivedClass1): # Код дочірнього класу 2 |
Тут клас DerivedClass1 є дочірнім від класу SuperClass, а DerivedClass2 є дочірнім від класу DerivedClass1.

Розглянемо приклад багаторівневого спадкування в Python:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class SuperClass: def super_method(self): print("Super Class method called") # Визначаємо клас, який успадковує SuperClass class DerivedClass1(SuperClass): def derived1_method(self): print("Derived class 1 method called") # Визначаємо клас, який успадковує DerivedClass1 class DerivedClass2(DerivedClass1): def derived2_method(self): print("Derived class 2 method called") # Створюємо об'єкт класу DerivedClass2 d2 = DerivedClass2() # Викликаємо методи d2.super_method() d2.derived1_method() d2.derived2_method() |
Результат:
Super Class method called
Derived class 1 method called
Derived class 2 method called
Тут DerivedClass2 є дочірнім від класу DerivedClass1, який є дочірнім від класу SuperClass. Це означає, що DerivedClass2 успадковує всі атрибути та методи як DerivedClass1, так і SuperClass.
Відповідно, ми використовуємо d2 (об’єкт класу DerivedClass2) для виклику методів із класів SuperClass, DerivedClass1 та DerivedClass2.
Порядок виклику методів (MRO) в Python
Якщо два батьківських класи мають однакове ім’я методу та дочірній клас (який успадковує 2 батьківські класи) викликає цей метод, Python використовує MRO (порядок виклику методів) для виклику потрібного методу. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class SuperClass1: def info(self): print("Super Class 1 method called") class SuperClass2: def info(self): print("Super Class 2 method called") class Derived(SuperClass1, SuperClass2): pass d1 = Derived() d1.info() |
Результат:
"Super Class 1 method called"
Тут обидва класи SuperClass1 та SuperClass2 мають метод info(). Коли метод info() викликається за допомогою об’єкта d1 класу Derived, Python використовує MRO, щоб визначити, метод якого класу слід викликати.
В цьому випадку MRO визначає, що методи повинні успадковуватися спочатку від найлівішого батьківського класу:
|
1 |
class Derived(SuperClass1, SuperClass2): |
Тому викликається метод info() класу SuperClass1, а не класу SuperClass2.
