Partage
  • Partager sur Facebook
  • Partager sur Twitter

POO - héritage

    29 novembre 2015 à 16:38:41

    Bonjour,

    En exécutant mon code j'obtiens systématiquement un message d'erreur du type :

    Traceback (most recent call last):

    File "/Users/quentinbauw/Desktop/Martin/Académique/Info S1 Saphire/Blupon.py", line 51, in <module>

    test=Graphe(donnees)

    File "/Users/quentinbauw/Desktop/Martin/Académique/Info S1 Saphire/Blupon.py", line 23, in __init__

    self.dico_calc[sommetDepart.nom+sommetDepart.nom]=Chemin(sommetDepart.nom,sommetDepart.nom)

    File "/Users/quentinbauw/Desktop/Martin/Académique/Info S1 Saphire/Blupon.py", line 41, in __init__

    Graphe.__init__(self,tuple)

    File "/Users/quentinbauw/Desktop/Martin/Académique/Info S1 Saphire/Blupon.py", line 11, in __init__

    self.nom=tupleEntree[0]

    TypeError: 'type' object is not subscriptable


    Il me semble que ce serait un problème d'héritage non pris en compte, le problème étant causé à la ligne d'appel de la classe Chemin dans la classe Graphe, c'est effectivement la première fois que je suis face à cette notion :o

    Le code en question :

    donnees=('Graphe1', ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
             [('A', 'A', 2), ('A', 'B', 5), ('A', 'C', 8), ('B', 'C', 6),
              ('B', 'D', 8), ('B', 'E', 6), ('C', 'B', 2), ('C', 'D', 1),
              ('C', 'E', 2), ('D', 'E', 3), ('D', 'F', 1), ('E', 'A', 5),
              ('E', 'D', 1), ('E', 'G', 5), ('F', 'D', 4), ('F', 'E', 1),
              ('F', 'G', 3), ('F', 'H', 6), ('E', 'I', 3), ('G', 'H', 2),
              ('H', 'B', 6), ('H', 'B', 7), ('I', 'J', 4), ('J', 'I', 5)])
    
    class Graphe():
        def __init__(self,tupleEntree):
            self.nom=tupleEntree[0]
            self.dico_sommets={}
            self.dico_arcs={}
            self.dico_calc={}
            self.dico_provi={}
            self.calc=[]
            self.provi=[]
            for i in tupleEntree[1]:
                self.dico_sommets[i]=Sommet(i)
            for j in tupleEntree[2]:
                self.dico_arcs[j]=Arc(j[0],j[1],j[2])
            for sommetDepart in self.dico_sommets.values():
                self.dico_calc[sommetDepart.nom+sommetDepart.nom]=Chemin(sommetDepart.nom,sommetDepart.nom)
            print(self.dico_calc)
            #    self.calc[0].poidsTotal=0
            #    print(self.calc[0].poidsTotal)  
            
            
    class Sommet():
        def __init__(self,sommet):
            self.nom=sommet
        
    class Arc():
        def __init__(self,debut,fin,poids):
            self.debut=debut
            self.fin=fin
            self.poids=poids
    
    class Chemin(Graphe):
        def __init__(self,depart,arrivee):
            Graphe.__init__(self,tuple)
            self.depart=depart
            self.arrivee=arrivee
            self.listeSommets=[]
            self.poidsTotal=0
        def MAJChemin(self,sommetSuivant,poidsArc):
            self.listeSommets.append(sommetSuivant)
            self.poidsTotal.append(poidsArc)
            
    print(donnees[0])
    test=Graphe(donnees)

    Merci à ceux qui prendront le temps de lire ! 

    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2015 à 17:02:35

      C'est normal car Chemin est dérivé de Graphe. Et dans le __init__ de Chemin, tu appelles le __init__ de Graphe avec comme argument tuple. Autrement dit, cet argument prend la place du paramètre tupleEntree (dans ta classe Graphe). Et dans cette classe tu fais:

      self.nom=tupleEntree[0]
      
      #Donc c'est comme si tu faisait
      self.nom = tuple[0]  #Çe qui renvoie ton erreur


      PS: J'en suis pas sûr, mais appeler une classe fille (Chemin) dans la classe mère (Graphe) me semble risqué (appel circulaire, à confirmer)

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
      Anonyme
        29 novembre 2015 à 20:15:35

        En gros tu fais l'équivalent de

        print(tuple[0]) # TypeError: 'type' object is not subscriptable

        d'où l'erreur...

        Il y a effectivement des erreurs de conception

        -
        Edité par Anonyme 29 novembre 2015 à 20:32:46

        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2015 à 21:16:57

          je ne comprends pas très bien la nature de mon erreur, ni la solution éventuellement implicite o_O
          • Partager sur Facebook
          • Partager sur Twitter
            29 novembre 2015 à 22:28:18

            Ton erreur se situe à la ligne 41:

            Graphe.__init__(self,tuple)


            Cette ligne est équivalente à faire:

            Graphe(tuple)


            Or à la ligne 11, tu mets:

            self.nom=tupleEntree[0]


            Donc avec le code de ta ligne 41, ça correspond à faire:

            self.nom = tuple[0]  #tuple est un type. Ça te renvoie forcément une erreur


            La question à se poser est de savoir si Chemin a vraiment besoin d'hériter de Graphe (j'en vois pas l'intérêt dans ton code)??

            • Partager sur Facebook
            • Partager sur Twitter
            Précepte: Le mieux est l'ennemi du bien

            POO - héritage

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown