Fundamentos de POO para interfaces gráficas en Python

Herencia múltiple

Cuando heredamos de varias clases y éstas no son Mixins, la herencia múltiple puede volverse en nuestra contra, ya que las subclases heredan todo el contenido de las superclases. ¿Pero es eso cierto? ¿Lo heredan todo? Pues no, en el caso de que dos o más superclases tengan el mismo método, solo uno de los métodos prevalecerá.

Esto se puede ilustrar con un ejemplo:

herencia_multiple.py

class A():
    def hola(self):
    	print("Hola heredado de la clase A")

class B():
    def hola(self):
    	print("Hola heredado de la clase B")

class C(A,B):
	pass

c = C()
c.hola()

Como véis la superclase dominante es la A, y la única razón para que sea así es que se encuentra más a la izquierda al heredarla. Sí, la posición es lo que determina la prioridad en la herencia cuando tenemos el mismo método.

Esto que a priori parece sin importancia puede ser un problema, porque imaginad el caso excepcional donde tenemos dos métodos solapados y queremos heredar uno de una clase específica, no podemos porque la prioridad lo destruye:

class A():
    def hola(self):
    	print("Hola heredado de la clase A")

    def adios(self):
    	print("Adiós heredado de la clase A")

class B():
    def hola(self):
    	print("Hola heredado de la clase B")

    def adios(self):
    	print("Adiós heredado de la clase B")

class C(A,B):
	pass

c = C()
c.adios()  # No podemos heredar de B aunque queramos

Por suerte hay una forma muy fácil de solucionar el problema. Esa es sobreescribir el método en la subclase y hacer la llamada manualmente al método de la superclase que necesitamos:

class C(A,B):

    def adios(self):
    	B.adios(self)