In questo tutorial imparerai l'ereditarietà multipla in Python e come usarla nel tuo programma. Imparerai anche l'ereditarietà multi-livello e l'ordine di risoluzione del metodo.
Ereditarietà multipla Python
Una classe può essere derivata da più di una classe base in Python, simile a C ++. Questa è chiamata ereditarietà multipla.
Nell'ereditarietà multipla, le caratteristiche di tutte le classi di base vengono ereditate nella classe derivata. La sintassi per l'ereditarietà multipla è simile all'ereditarietà singola.
Esempio
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Qui, la classe MultiDerived è derivata dalle classi Base1 e Base2.

La classe MultiDerived eredita da entrambe le classi Base1 e Base2.
Ereditarietà multilivello Python
Possiamo anche ereditare da una classe derivata. Questa è chiamata eredità multilivello. Può essere di qualsiasi profondità in Python.
Nell'ereditarietà multilivello, le caratteristiche della classe base e della classe derivata vengono ereditate nella nuova classe derivata.
Di seguito viene fornito un esempio con la visualizzazione corrispondente.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
In questo caso, la classe Derived1 è derivata dalla classe Base e la classe Derived2 è derivata dalla classe Derived1.

Ordine di risoluzione del metodo in Python
Ogni classe in Python è derivata dalla object
classe. È il tipo più elementare in Python.
Quindi, tecnicamente, tutte le altre classi, integrate o definite dall'utente, sono classi derivate e tutti gli oggetti sono istanze della object
classe.
# Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))
Nello scenario di ereditarietà multipla, qualsiasi attributo specificato viene cercato per primo nella classe corrente. Se non viene trovato, la ricerca continua nelle classi genitore in modo approfondito, da sinistra a destra, senza cercare due volte la stessa classe.
Così, nell'esempio di cui sopra della MultiDerived
classe l'ordine di ricerca è ( MultiDerived
, Base1
, Base2
, object
). Questo ordine è anche chiamato linearizzazione di MultiDerived
classe e l'insieme di regole utilizzate per trovare questo ordine è chiamato Method Resolution Order (MRO) .
L'MRO deve impedire l'ordinamento di precedenza locale e fornire anche la monotonia. Assicura che una classe appaia sempre prima dei suoi genitori. In caso di più genitori, l'ordine è lo stesso delle tuple delle classi base.
L'MRO di una classe può essere visto come l' __mro__
attributo o il mro()
metodo. Il primo restituisce una tupla mentre il secondo restituisce una lista.
>>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )
Ecco un esempio di ereditarietà multipla un po 'più complesso e la sua visualizzazione insieme all'MRO.

# 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())
Produzione
(,,,,,,)
Per conoscere l'attuale algoritmo su come viene calcolato l'MRO, visita Discussion on MRO.