У цьому підручнику ви дізнаєтеся про множинне успадкування в Python та як використовувати його у своїй програмі. Ви також дізнаєтесь про багаторівневе успадкування та порядок роздільної здатності методу.
Множинне успадкування Python
Клас може бути отриманий з декількох базових класів у Python, подібних до C ++. Це називається багаторазовим успадкуванням.
При багаторазовому успадкуванні ознаки всіх базових класів успадковуються у похідний клас. Синтаксис багаторазового успадкування подібний до одиночного успадкування.
Приклад
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Тут клас MultiDerived є похідним від класів Base1 та Base2.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it_.jpg.webp)
Клас MultiDerived успадковується від класів Base1 та Base2.
Багаторівневе успадкування Python
Ми також можемо успадкувати від похідного класу. Це називається багаторівневим успадкуванням. У Python це може бути будь-якої глибини.
У багаторівневому успадкуванні ознаки базового класу та похідного класу успадковуються у новий похідний клас.
Приклад із відповідною візуалізацією наведено нижче.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
Тут клас Derived1 походить від класу Base, а клас Derived2 походить від класу Derived1.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__2.jpg.webp)
Порядок дозволу методу на Python
Кожен клас у Python є похідним від object
класу. Це найбільш базовий тип у Python.
Тож технічно всі інші класи, як вбудовані, так і визначені користувачем, є похідними класами, і всі об’єкти є екземплярами object
класу.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
У сценарії багаторазового успадкування будь-який вказаний атрибут шукається першим у поточному класі. Якщо не знайдено, пошук продовжується у батьківських класах поглиблено спочатку, ліворуч-праворуч, не виконуючи пошук одного класу двічі.
Так, у наведеному вище прикладі MultiDerived
класу порядок пошуку ( MultiDerived
, Base1
, Base2
, object
). Цей порядок також називається лінеаризацією MultiDerived
класу, а набір правил, що використовується для пошуку цього порядку, називається порядок дозволу методів (MRO) .
MRO повинен запобігати упорядкуванню місцевих переваг, а також забезпечувати монотонність. Це гарантує, що клас завжди постає перед батьками. У випадку кількох батьків порядок такий самий, як кортежі базових класів.
MRO класу можна розглядати як __mro__
атрибут або mro()
метод. Перший повертає кортеж, а другий - список.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Ось трохи більш складний приклад множинного успадкування та його візуалізація разом із MRO.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__3.jpg.webp)
# Demonstration of MRO class X: pass class Y: pass class Z: pass class A(X, Y): pass class B(Y, Z): pass class M(B, A, Z): pass # Output: # (, , # , , # , , # ) print(M.mro())
Вихідні дані
(,,,,,,)
Щоб знати фактичний алгоритм обчислення MRO, відвідайте Дискусію про MRO.