Ereditarietà multipla Python: cos'è e come si usa?

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.

Ereditarietà multipla in Python

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.

Ereditarietà multilivello in Python

Ordine di risoluzione del metodo in Python

Ogni classe in Python è derivata dalla objectclasse. È 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 objectclasse.

 # 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 MultiDerivedclasse l'ordine di ricerca è ( MultiDerived, Base1, Base2, object). Questo ordine è anche chiamato linearizzazione di MultiDerivedclasse 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.

Visualizzazione dell'ereditarietà multipla in 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())

Produzione

 (,,,,,,)

Per conoscere l'attuale algoritmo su come viene calcolato l'MRO, visita Discussion on MRO.

Articoli interessanti...