Guida programmazione orientata agli oggetti » Torna alla lezione

Esempio di ereditarietà multipla [Python]

Nell'esempio che segue vengono definite 3 classi: A, B e C. Le classi A e B sono indipendenti tra loro e contengono entrambe la definizione di due metodi (metodo1 e metodo2) aventi lo stesso nome sia per A che per B (la classe B definisce anche un terzo metodo: metodo3). La classe C, deriva sia da A che da B e definisce, a sua volta, il metodo denominato metodo1:

class A:
    def metodo1(self):
        print "Metodo 'metodo1' della classe A"
    def metodo2(self):
        print "Metodo 'metodo2' della classe A"
class B:
    def metodo1(self):
        print "Metodo 'metodo1' della classe B"
    def metodo2(self):
        print "Metodo 'metodo2' della classe B"
    def metodo3(self):
        print "Metodo 'metodo3' della classe B"
class C(A, B):
    def metodo1(self):
        print "Metodo 'metodo1' della classe C"

Se si crea un'istanza della classe C e si invoca uno dei suoi metodi, è possibile determinare se il comportamento del metodo invocato è definito nella stessa classe C, nella classe padre A o nella classe padre B. Le regole che determinano in modo univoco la scelta del metodo da invocare si basano su queste semplici considerazioni:

Se la classe C (ovvero quella che implementa l'eredità multipla) definisce un metodo definito anche nelle superclassi allora verrà usata tale definizione. Nel nostro esempio, il metodo metodo1 verrà invocato secondo la definizione data nella classe C. In caso contrario, verrà utilizzata la gerarchia di ereditarietà definita per la classe C per cercare nelle sue classi padre la definizione del metodo invocato. L'ordine di ricerca dipende dalla definizione con cui è stata fissata l'ereditarietà (ovvero, nel nostro esempio si ricercherà prima nella classe padre A e poi, eventualmente, in B).

Dunque, secondo quanto detto, dall'esempio proposto otterremo i seguenti risultati:

>>> obj = C()

>>> obj.metodo1()
Metodo 'metodo1' della classe C

>>> obj.metodo2()
Metodo 'metodo2' della classe A

>>> instance.metodo3()
Metodo 'metodo3' della classe B