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 :

Classes et Instances [Fait]


Sujet :

Python

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 133
    Par défaut Classes et Instances
    Bonjour Je suis débutant en python et je m'entraîne, notament sur les classes. J'ai un problème qui va sans doute vous paraître trivial mais je ne comprend pas une erreur.
    J'ai fait une classe Echiquier et Case (ci-dessous) et lorsque je l'utilise (dernières lignes) je crée une instance de Echiquier(), toutes les cases de mon échiquier sont initialisées à "vide". Puis j'essaie de modifier juste 1 case pour y mettre un cavalier noir (par exemple) et il me met la même pièce sur 8 cases.
    Je me doute bien que c'est parce qu'il a créé que 8 instances au lieu de 64, et qu'il a réutilisé 8 fois la même référence vers ces instances, mais je ne sais pas pourquoi il a fait ça, et comment résoudre ce genre de problème.

    Si vous pouvez m'aider j'attend davantage une explication que la solution à ce cas particulier.

    Merci d'avance.

    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
    piece=["le vide","un pion","un cavalier","un fou","une tour","une dame","le roi"]
    blanc=[""," blanc"," blanc"," blanc"," blanche"," blanche"," blanc"]
    noir=[""," noir"," noir"," noir"," noire"," noire"," noir"]
     
    class Case :
      def __init__(self) :
        self.valeur=0
        self.piece=0
      def afficher(self) :
        if self.valeur>0 :
          couleur=blanc[self.piece]
        elif self.valeur<0 :
          couleur=noir[self.piece]
        else :
          couleur=""
        print "Cette case contient "+piece[self.piece]+couleur+" de valeur %s" % (abs(self.valeur))
     
    class Echiquier :
      def __init__(self) :
        self.case=[[0]*8]*8
        for i in range(8) :
          for j in range(8) :
            self.case[i][j]=Case()
     
    e=Echiquier()
    e.case[0][0].piece=2
    e.case[0][0].valeur=-3
    for i in range(8) :
      for j in range(8) :
        e.case[i][j].afficher()

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    C'est une erreur classique en python.
    Regarde ceci: http://python.developpez.com/faq/?page=Liste#listlist

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 133
    Par défaut
    ah oui !! ouf j'ai eu peur que ce ne soit quelque chose de complexe !
    j'avais pas vu ça dans la FAQ je cherchais au mauvais endroit

    merci (gui)**2 !!!

  4. #4
    Membre du Club
    Profil pro
    Chef de projet
    Inscrit en
    Août 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Août 2006
    Messages : 7
    Par défaut
    Sinon pourquoi ne pas utiliser numarray ?
    L'initialisation se fait en une ligne et la fonction print donne un résultat plus lisible.
    >>> import numarray
    >>> echec = numarray.resize(numarray.array((0,0)), (8, 8))
    >>> print echec
    [[0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0]]

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 133
    Par défaut
    je n'ai pas le module numarray donc c'est pas la peine de le mettre "juste" pour ça, mais merci quand même

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

Discussions similaires

  1. class Runtime instance
    Par salyiohh dans le forum Général Java
    Réponses: 1
    Dernier message: 01/02/2011, 07h16
  2. Héritage : Classe mère instancié via sa fille
    Par amine_en_france dans le forum Langage
    Réponses: 7
    Dernier message: 01/10/2010, 17h48
  3. Utilisation de classe deja instanciés
    Par Verbalinsurection dans le forum C++
    Réponses: 9
    Dernier message: 16/05/2008, 15h10
  4. Class static = instance unique ?
    Par maa dans le forum C#
    Réponses: 36
    Dernier message: 30/09/2007, 00h46
  5. [VB.NET] Classes et instances
    Par Bz dans le forum ASP.NET
    Réponses: 6
    Dernier message: 16/02/2006, 09h46

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