Problème en python

Fermé
gomul - 3 mai 2004 à 20:34
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 5 mai 2004 à 08:57
Bon jour!
ca fait qq semaines q j'essaie de faire tours d'hanoi en python mais g tjs des problèmes, ( normal mais cette fois c pas normal )
en fait ici il s'agit d'1 bleme au niveau de la fonction transferer ds la classe clTour, qd je fais appel a la fontion append
"vers_tour.disques.append(self.sommet())" elle me met c qui est renvoyé par self.sommet() ds toutes les autres cases de ma liste, comment résoudre le problème pour qu'elle mette juste c ki est renvoyé par sommet() ds la cases de destination ou vers_tour ?
Merci


class clTour :
  hauteur_max = 0
  disques = []
  def __init__ (self, hauteur) :
   self.hauteur_max = hauteur

  def remplir(self) :
   self.disques = range (1, self.hauteur_max+1)
   # range est une fonction spéciale de Python, elle retourne une
   # liste d'entiers compris entre le premier param et le dernier non compris
   self.disques.reverse()
  # trie la liste en ordre décroissant
  
  def sommet(self) :
   if ( len(self.disques) > 0 ) :
      return self.disques[-1]
     #return len(self.disques)
   else :
    return len(self.disques)
  
  def disque(self, etage) :
   if ( etage <= len(self.disques) ) :
     return self.disques[etage-1]
   else :
    return 0
   
  def nbDisques(self) :
   return len(self.disques)
  
  def transferer(self, vers_tour) : 
    if ( self.nbDisques() > 0 ) : 
      if ( ( self.sommet() < vers_tour.sommet() ) or \
           ( vers_tour.nbDisques() == 0 ) ) : 
        vers_tour.disques.append(self.sommet())
# append  ajoute l'objet passé par paramÚtre un fin de liste
        del self.disques[-1]
        # supprime le dernier élément de la liste     
      else :
        print "Impossible d'empiler un disque sur un plus petit"
    else :
      print "Tour vide, rien à transférer"

class clHanoi :
  tours = []
  hauteur_max = 0
  def __init__ ( self, hauteur) :
    self.hauteur_max=hauteur
    self.tours = [clTour(hauteur), clTour(hauteur), clTour(hauteur)]
    self.tours[0].remplir()
  def departValide(self, tour_depart) :
      if ( tour_depart < 0 or tour_depart > 2) :
           return 0
      if ( self.tours[tour_depart].nbDisques() == 0 ) :
           return 0
      return 1

  def arriveeValide(self, tour_depart, tour_arrivee) :
     if ( not self.departValide(tour_depart) ) :
       return 0    
     if ( tour_arrivee < 0 or tour_arrivee > 2) :
       return 0
     if ( self.tours[tour_arrivee].nbDisques() == 0 ) :
       return 1
     if ( self.tours[tour_depart].sommet() >= self.tours[tour_arrivee].sommet() ) :
       return 0
     return 1

  def fini(self) :
    return ( self.tours[2].nbDisques == self.hauteur_max )

2 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
4 mai 2004 à 09:52
Tu as déclaré ta classe tour comme:
class clTour :
  hauteur_max = 0
  disques = []


Ce qui veut dire que les variables hauteur_max et disques sont des variables de classe: Elles sont partagées par tous les objets de type clTour.

Pour les déclarer comme variable d'instance, il faut les mettre dans le constructeur __init__():
self.hauteur_max = 0
self.disques = []




Démonstration:

Variable de classe:
class classeA:
  liste = []
  def __init__(self):
     pass

c = classeA()
b = classeA()
c.liste.append("coucou")
print b.liste


Cela affichera ["coucou"]: liste est partagé par c et b.


Variable d'instance:
class classeB:
  def __init__(self):
     self.liste = []

c = classeB()
b = classeB()
c.liste.append("coucou")
print b.liste


Là, ça affichera [], car c et b on chacun leur liste.
0
Ca marche!!, MERCI, je commence à comprendre python, c plus compliqué de c q g pensé :p .... par rapport au c++ ou java au niveau du Oriente Objet
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
5 mai 2004 à 08:57
bah non, c'est pas plus compliqué. :-)

Java et C++ ont aussi la notion d'attributs de classe ou d'objet (mot clé "static").
0