Множинне успадкування Python: що це таке і як ним користуватися?

У цьому підручнику ви дізнаєтеся про множинне успадкування в Python та як використовувати його у своїй програмі. Ви також дізнаєтесь про багаторівневе успадкування та порядок роздільної здатності методу.

Множинне успадкування Python

Клас може бути отриманий з декількох базових класів у Python, подібних до C ++. Це називається багаторазовим успадкуванням.

При багаторазовому успадкуванні ознаки всіх базових класів успадковуються у похідний клас. Синтаксис багаторазового успадкування подібний до одиночного успадкування.

Приклад

 class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass

Тут клас MultiDerived є похідним від класів Base1 та Base2.

Множинне успадкування в Python

Клас MultiDerived успадковується від класів Base1 та Base2.

Багаторівневе успадкування Python

Ми також можемо успадкувати від похідного класу. Це називається багаторівневим успадкуванням. У Python це може бути будь-якої глибини.

У багаторівневому успадкуванні ознаки базового класу та похідного класу успадковуються у новий похідний клас.

Приклад із відповідною візуалізацією наведено нижче.

 class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass

Тут клас Derived1 походить від класу Base, а клас Derived2 походить від класу Derived1.

Багаторівневе успадкування в Python

Порядок дозволу методу на 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.

Візуалізація множинної спадщини в Python
 # 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.

Цікаві статті...