Partage
  • Partager sur Facebook
  • Partager sur Twitter

Héritage d’attribut

Sujet résolu
    2 décembre 2010 à 0:01:55

    Bonsoir.


    Ma question est comment hérite-t-on des attributs d'une classe parente?

    petite précision:

    Classe mère
    class Unite:
    	def __init__(self):
    		self.pv=100
    		self.x=10
    		self.y=10
    	def move(self,x,y):
    		self.x+=x
    		self.y+=y
    


    Classe héritante
    class Fantassin(Unite):
    	
    	def __init__(self,pa):
    		self.pa=pa
    	def attaque(self,perso):
    		perso.pv-=self.pa
    		perso.x-=1
    


    Erreur:

    Traceback (most recent call last):
      File "<pyshell#118>", line 1, in <module>
        conan.x
    AttributeError: 'Fantassin' object has no attribute 'x'


    Merci. :)
    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2010 à 1:08:10

      Ce ne sont pas les attributs qui s'héritent (d'ailleurs ça ne veut rien dire), il faut simplement appeler le constructeur de Unite dans le constructeur de Fantassin, regarde dans la doc la fonction super() qui te permet de faire ça automatiquement.
      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2010 à 1:11:26

        Tu as oublié d'initialiser la classe hérité dans ta méthode __init__.

        Unite.__init__(self)
        • Partager sur Facebook
        • Partager sur Twitter
          2 décembre 2010 à 7:44:46

          Début de POO difficile, maintenant ça fonctionne

          Merci FMIS@Menace :)
          • Partager sur Facebook
          • Partager sur Twitter
            2 décembre 2010 à 9:45:47

            La manière la plus "correcte" (en tout cas la plus sémantique) d'appeler une méthode de la classe parente est, comme LordCasqueNoir l'a dit, d'appeler super() (bien que celle que t'a montré FMIS marche tout aussi bien) :

            Sous Python 2 et 3 (la méthode qui marche toujours)

            # super(ClasseDerivee, self)
            super(Fantassin, self).__init__()
            


            Sous Python 2 (si tes classes sont "new style", c'est-à-dire que la classe mère hérite explicitement de object ) et 3 (dans tous les cas) dans un cas d'héritage simple comme le tien :

            super().__init__()
            
            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              2 décembre 2010 à 11:41:14

              Citation : NoHaR

              La manière la plus "correcte" (en tout cas la plus sémantique) d'appeler une méthode de la classe parente est, comme LordCasqueNoir l'a dit, d'appeler super() (bien que celle que t'a montré FMIS marche tout aussi bien) :

              Sous Python 2 et 3 (la méthode qui marche toujours)

              # super(ClasseDerivee, self)
              super(Fantassin, self).__init__()
              



              Sous Python 2 (si tes classes sont "new style", c'est-à-dire que la classe mère hérite explicitement de object ) et 3 (dans tous les cas) dans un cas d'héritage simple comme le tien :

              super().__init__()
              


              Ah c'est bon à savoir. J'ai copié le code directement dans mon IDLE, j'ai utilisé super(), mais j'avais des TypeError, alors j'ai laissé tomber ^^. J'utilise toujours super() quand je code, mais j'utilise toujours object donc j'y ai pas pensé.
              • Partager sur Facebook
              • Partager sur Twitter

              Héritage d’attribut

              × 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