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 :

[POO] Attribut et fonction : question sur un exemple


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [POO] Attribut et fonction : question sur un exemple
    Bonjour,

    Je suis en train d'apprendre Python en décortiquant des scripts. J'ai un niveau assez basique en programmation, et là je bute sur une façon d'appeler une fonction que je comprends en gros (je sais ce qu'elle produit) mais quand j'essaie de coder cette "pattern" dans un projet personnel, j'obtiens une erreur d'attribut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     class MudPlayer:  
     def __init__(self, name):  
       self.inventory = {}  
     
     def use(self, what):  
       if self.inventory.has_key(what):  
         return self.inventory[what].use()  
       else:  
         return 'you do not have ' + what
    Le dict self.inventory est défini au moment de la création d'une instance de la classe (il reçoit des string et d'autres objets). Aucun problème. Mais ce que je n'arrive pas à reproduire ailleurs, c'est l'appel à la fonction self.inventory[what].use(). J'obtiens des erreurs sur le fait que le type dict n'a pas d'attribut de ce genre, etc.

    Le code complet du script qui tourne est ici :
    http://paranoid-engineering.blogspot...e-example.html

    Merci pour l'aide, j'espère avoir été assez clair

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Ce code n'est pas utilisable seul. Vous devez avoir une instance MudObject (avec la méthode .use() donc).

    Avec quelques print cela devrez vous parler plus
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class MudObject:  
       def __init__(self, name, sight, collide='nothing happens', usability='unusable'):  
           self.name = name  
           self.sight = sight  
           self.collide = collide  
           self.usability = usability
     
       def view(self):  
           return self.sight
     
       def touch(self):  
           return self.collide
     
       def use(self):  
           return self.usability
     
     
    class MudPlayer:  
       def __init__(self, name):  
           self.inventory = {}
           self.name = name
     
       def use(self, what):  
           if self.inventory.has_key(what):
               print(self.inventory[what].use())
               return self.inventory[what].use()  
           else:
               print('you do not have ' + what)
               return 'you do not have ' + what
     
       def take(self, obj):  
           self.inventory[obj.name] = obj
           print(self.name + ' puts ' + obj.name + ' in his inventory')  
           return self.name + ' puts ' + obj.name + ' in his inventory'  
     
     
    toto = MudPlayer('Toto')
    livre = MudObject('livre', 'vue', collide='nothing happens', usability='usable')
    toto.take(livre)
    toto.use('livre')
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,

    Merci pour ce début. Je comprends bien l'appel de la fonction, mais

    génère l'erreur : AttributeError: 'dict' object has no attribute 'has_key'

    et

    aussi

    J'ai Python 3.2 installé.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'est normal, c'est du code pour Python 2.x.
    Sous Python 3 .has_key(k) est remplacé par in.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if self.inventory.has_key(what):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if what in self.inventory:
    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Parfait, merci !

    Ma confusion vient du fait que je pensais qu'il appelait la fonction homonyme dans la classe MudPlayer. Or, si je comprends bien, le fait que le dict contienne une instance de MudObject, permet d'appeler ainsi l'attribut de la classe concernée.

    Merci encore

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/05/2010, 18h34
  2. [POO] Question sur les fonctions
    Par Carb0 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/11/2008, 15h18
  3. Réponses: 4
    Dernier message: 10/04/2007, 12h29
  4. Réponses: 5
    Dernier message: 13/10/2005, 12h46
  5. question sur les attributs javascript
    Par PAYASS59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/04/2005, 13h34

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