IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Python 2.7] Héritage et 'Has no attribute"


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2011
    Messages : 26
    Points : 42
    Points
    42
    Par défaut [Python 2.7] Héritage et 'Has no attribute"
    Bonsoir,

    Je m'appelle Mickaël et je suis confronté à un petit problème avec le langage python que je n'arrive pas à résoudre. J'utilise la Bibliothèque Pygame pourla réalisation d'un petit moteur de jeux.

    J'ai une classe "AnimatedObject" qui fonctionne parfaitement et une classe "Personnage" qui doit hériter de celle-ci.
    Jusque là, tout fonctionne. Mais voilà, la classe AnimatedObject possede un fonction update(). C'est cette fonction qui est appeller pour mettre à jour l'état de l'objet. J'aimerais dans ma classe Personnage créer la meme fonction update executant le même code mais avec des choses en plus.

    A première vue, ca fonctionnait mais de que j'utilise des attribut propre a personnage, le compilateur râle et me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'Personnage' object has no attribute 'touche_sol'
    Voici la classe Personnage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import pygame, random
    from pygame.locals import *
    from AnimatedObject import AnimatedObject
     
    class Personnage(AnimatedObject):
        #constructeur
        def __init__(self, config="bin/xml/personnage.xml", pFps=3):
            #appel constructeur parent
           AnimatedObject.__init__(self, config, pFps)
           self.touche_sol=0
           self.gravity=3
           self.saut=0
           self.hauteur_saut=20
        def update(self, t, width, height):
            AnimatedObject.update(self, t, width, height)
            #Saut
            if self.touche_sol==0:
                if self.saut <=self.hauteur_saut:
                    self.saut+=self.gravity
                if (self.y>=380):
                    self.touche_sol=1
                    self.y=380
        def sauter(self,ground):
            if(self.touche_sol):
               self.touche_sol=0
               self.saut=-self.hauteur_saut
    Voilà, ce langage est assez nouveau pour moi,
    Merci d'avance,

    Deims

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    L'attribut .touche_sol est assigné lors de la construction de l'objet (méthode __init__) et si l'appel à AnimatedObject.__init__(self, config, pFps) (qui est "avant") à la mauvaise idée d'appeler self.update => badaboum.
    Essayez plutôt d'assigner ces attributs avant cet appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Personnage(AnimatedObject):
        #constructeur
        def __init__(self, config="bin/xml/personnage.xml", pFps=3):
            #appel constructeur parent
            ### AnimatedObject.__init__(self, config, pFps)
           self.touche_sol=0
           self.gravity=3
           self.saut=0
           self.hauteur_saut=20
           AnimatedObject.__init__(self, config, pFps)
    Divers:
    L'erreur "AttributeError: 'Personnage' object has no attribute 'touche_sol'" indique que vous utillisez Python3. En 2.7 çà dirait plutôt: "AttributeError: A instance has no attribute 'bar'"

    SI tel est le cas, utilisez plutôt la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          super().__init__(config, pFps)
    Comme vous assignez à vos attributs des constantes, vous pouvez dans ce cas utilisez des attributs de "classe" de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Personnage(AnimatedObject):
        #constructeur
        touche_sol=0
        gravity=3
        saut=0
        hauteur_saut=20
        def __init__(self, config="bin/xml/personnage.xml", pFps=3):
              super().__init__(config, pFps)
    Ils permettent ici d'avoir la valeur par défaut.
    Lorsque le programme voudra les modifier, l'assignation se fera par instance.

    Jouez avec pour voir et ralez si vous ne pigez pas.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2011
    Messages : 26
    Points : 42
    Points
    42
    Par défaut
    Bonsoir,
    Merci pour cette réponse très rapide et vraiment complète. Le problème venait effectivement de l'appel de la méthode update dans le constructeur parent.

    Tes explications sont très claire et je comprends beaucoup pourquoi ca ne fonctionnait pas. Par contre, j'utilise bien python 2.7. J'utilise PyDev avec un projet python27 et l’interpréteur mentionné pointe bien vers le dossier de python 2.7.

    Concernant les constantes, elles ne le seront bientôt plus mais merci pour l'info, ça me sera très utile pour la suite.

    Merci pour cette aide précieuse et précise,
    Cordialement,

    Deimz

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ftp : 'str' object has no attribute 'read'
    Par noquioz dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 02/01/2009, 15h46
  2. x object has no attribute y (PyQ4t et QLineEdit)
    Par EricStib dans le forum PyQt
    Réponses: 9
    Dernier message: 23/10/2008, 23h00
  3. [POO] Héritage et visibilité des attributs : pas de "protected" en JS ?
    Par Hervé Saladin dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2007, 15h44
  4. Probleme : AttributeError: 'tuple' object has no attribute
    Par MrGecko dans le forum Général Python
    Réponses: 1
    Dernier message: 27/05/2007, 09h59
  5. Réponses: 2
    Dernier message: 26/05/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo