Manipuler une liste d'objets

Manipuler une liste d'objets - Python - Programmation

Marsh Posté le 05-06-2006 à 18:29:51    

Salut, je débute en python et n'ayant jamais fait d'OOP, autant dire que c'est chaud. Je comprends bien la theorie mais de là à l'appliquer .... [:tinostar]  
 
Voila, j'arrive à créer une liste d'instances de la classe SampleClass mais j'ai beau chercher, j'arrive pas à trouver d'exemple de manipulation d'une telle liste.
 

Code :
  1. class SampleClass :
  2. #Creation de la classe sample
  3.      def __init__ (self, HoleId, SampleId, Depth, THM):
  4.      #Definition des attributs de chaque instance
  5.           self.HoleId = HoleId
  6.           self.SampleId = SampleId
  7.           self.Depth = Depth
  8.           self.THM = THM
  9. #exemple de creation d'instances samples
  10. s1 = SampleClass(10,101,1.5,2)
  11. s2 = SampleClass (10,102,3,3)
  12. s3 = SampleClass(10,103,4.5,5)
  13. s4 = SampleClass ( 10,104, 6, 1)
  14. #creation de la liste
  15. SampleList = []
  16. #je popule la liste avec les samples dans le desordre
  17. SampleList.append(s4)
  18. SampleList.append(s1)
  19. SampleList.append(s3)
  20. SampleList.append(s2)


 
Mes questions seraient :
- Comment puis je faire pour classer mes samples dans ma liste en fonction de l'attribut "Depth"
- Comment ensuite aller chercher les valeurs de THM de chaque sample ainsi classés
 
Je retourne, mes recherches, merci.


Message édité par xla99 le 06-06-2006 à 02:22:08
Reply

Marsh Posté le 05-06-2006 à 18:29:51   

Reply

Marsh Posté le 05-06-2006 à 18:36:45    

1. Style [:pingouino] Tu ne suis pas du tout les conventions de la PEP 8 "Style Guide for Python Code", prière de la lire [:pingouino]
2. Fais hériter tes classes d' "object"
3. __cmp__
4. Ca te dirait de lire le Python Tutorial?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-06-2006 à 20:46:56    

masklinn a écrit :

1. Style [:pingouino] Tu ne suis pas du tout les conventions de la PEP 8 "Style Guide for Python Code", prière de la lire [:pingouino]
2. Fais hériter tes classes d' "object"
3. __cmp__
4. Ca te dirait de lire le Python Tutorial?


 
1. Je m'excuse mais bon, la touche tab ne fonctionne pas. J'ai corrigé ma syntaxe avec moultes spaces.
 
2/3/4 Je me suis tapé tout le chapitre sur les listes et l'OOP ( entre autre ) de Learning Python Ed O'Reilly ainsi que Plonger au coeur de python et A byte of python. Bon, je débute complêtement en Python juste par interet pour pimenter ma job et ma seule experience  en progr est un cours d'initiation en VB il y a 5 ans [:cupra] .  
Je pige les concept mais pour les appliquer, c'est autre chose ! Tu me parles de faire hériter mes instances de la Classe SampleClass en m'aidant de __cmp__ . Je veus bien mais mon problème là, c'est que je n'arrive pas à accéder aux attributs de mes instances dans ma liste. Si je fais un print  de celle-ci, j'obtiens l'espace mémoire qui leur est aloué ( si j'ai bien compris ) :

Citation :

print SampleList
>>> [<__main__.SampleClass instance at 0x0116B378>, <__main__.SampleClass instance at 0x01162800>, <__main__.SampleClass instance at 0x0116B508>, <__main__.SampleClass instance at 0x0116B940>]


 
Donc, comment je pourrais avoir accès à sX.Depth par exemple ?
 
Oui, je suis un gros bleu, je pourrais tout faire avec un paquet de listes imbriquées et juste en prodédural mais là, j'aimerais faire l'exercice uniquement en OOP avec classes, methodes, etc ... C'est sur qu'il y a quelque chose qui m'échappe complêtement ici mais je ne trouve aucune référence dans les bouquins ou sur internet de manipulation de listes composées d'instances d'une classe d'objet. Je comprends les exemples et les utilisation des listes ( basiques ) et des objets, j'arrive à me taper les exercices des bouquins mais nul part on m'explique comment mixer les deux !  
 
Alors voila, je suis démasqué  [:tinostar] Mais je vais continuer à m'ésquinter les neurones la dessus.
 
Merci

Message cité 1 fois
Message édité par xla99 le 05-06-2006 à 22:02:57
Reply

Marsh Posté le 05-06-2006 à 22:02:05    

xla99 a écrit :

1. Je m'excuse mais bon, la touche tab ne fonctionne pas. J'ai corrigé ma syntaxe avec moultes spaces.


Je parlais pas des espaces, va lire cette putain de PEP8, et si tu veux mettre du code il faut utiliser la balise code.

xla99 a écrit :

Je pige les concept mais pour les appliquer, c'est autre chose ! Tu me parle de faire hériter mes instances de la Classe SampleClass en m'aidant de __cmp__ .


WTF [:petrus dei]
 
J'ai jamais dit ça [:pingouino]
 
J'ai dit deux choses:
1. Quand tu crées une classe, fait la hériter d'object ou d'une classe héritant d'objet, ça veut dire faire ça:

Code :
  1. class TestClass(object):
  2.    pass


2. Si tu veux pouvoir trier une liste, il faut que tes objets implémentent la méthode __cmp__, comparateur général, suffit d'aller voir dans l'aide python pour savoir comment ça fonctionne

xla99 a écrit :

Je veus bien mais mon problème là, c'est que je n'arrive pas à accéder aux attributs de mes instances dans ma liste. Si je fais un print  de celle-ci, j'obtiens l'espace mémoire qui leur est aloué ( si j'ai bien compris ) :


Ben t'as mal compris, print ne fait qu'imprimer ce que object.__str__() retourne.

xla99 a écrit :

Donc, comment je pourrais avoir accès à sX.Depth par exemple ?


Heuuu c'est une blague [:petrus dei]

xla99 a écrit :

Je comprends les exemples et les utilisation des listes ( basiques ) et des objets


J'ai pas l'impression non.
 
Une liste d'objets contient des objets, c'est tout, chaque slot de ta liste contient un objet [:spamafote]
 
Comment tu ferais pour récupérer le 3e objet de ta liste par exemple [:petrus dei]

Message cité 1 fois
Message édité par masklinn le 05-06-2006 à 22:03:46

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-06-2006 à 22:06:21    

masklinn a écrit :

Je parlais pas des espaces, va lire cette putain de PEP8, et si tu veux mettre du code il faut utiliser la balise code.
 
WTF [:petrus dei]
 
J'ai jamais dit ça [:pingouino]
 
J'ai dit deux choses:
1. Quand tu crées une classe, fait la hériter d'object ou d'une classe héritant d'objet, ça veut dire faire ça:

Code :
  1. class TestClass(object):
  2.    pass


2. Si tu veux pouvoir trier une liste, il faut que tes objets implémentent la méthode __cmp__, comparateur général, suffit d'aller voir dans l'aide python pour savoir comment ça fonctionne
 
Ben t'as mal compris, print ne fait qu'imprimer ce que object.__repr__() retourne.
 
Heuuu c'est une blague [:petrus dei]
 
J'ai pas l'impression non.
 
Une liste d'objets contient des objets, c'est tout, chaque slot de ta liste contient un objet [:spamafote]
 
Comment tu ferais pour récupérer le 3e objet de ta liste par exemple [:petrus dei]


 
Bon, je suis en train de réaliser que le sol se dérobe sous mes pieds et que j'ai encore bcp de lectures devant moi et pas mal de theorie à ingurgiter.
 [:pseudoman]  
En tout cas, merci quand même
 [:cupra]  

Reply

Marsh Posté le 05-06-2006 à 22:08:38    

Nan mais tu peux continuer à poser des questions hein, simplement si tu as vraiment lu le Python Tutorial et Dive je pense vraiment que tu ne les as pas compris et que tu devrais les relire sérieusement


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-06-2006 à 14:57:50    

Bon, j'ai trouvé la solution
 

Code :
  1. #Creation de la classe Sample
  2. class SampleClass :
  3.     def __init__(self, HoleId, SampleId, Depth, THM):
  4.         self.HoleId=HoleId
  5.         self.SampleId=SampleId
  6.         self.Depth=Depth
  7.         self.THM=THM
  8.     #methode permettant de retourner une representation
  9.     #en string de l'objet
  10.     def __str__(self):
  11.         out = "Hole %d Sample %d Depth %f THM %d" \
  12.  %(self.HoleId, self.SampleId, self.Depth, self.THM)
  13.         return out
  14.    
  15.     #methode de comparaison general basee sur
  16.     #l'attribut Depth
  17.     def __cmp__(self,sample2):
  18.         return cmp(self.Depth, sample2.Depth)
  19. #Liste globale des samples
  20. SampleList = []
  21. #Fonction qui va permettre d'afficher le contenu de ma liste
  22. def affichSamples():
  23.     print"Liste des Samples:\n"
  24.     for samp in SampleList:
  25.         print"\t",samp
  26.            
  27. s1 = SampleClass(10,101,1.5,3)
  28. s2 = SampleClass(10,102,3,3)
  29. s3 = SampleClass(10,103,4.5,3)
  30. s4 = SampleClass(10,104, 6, 3)
  31. SampleList=[s4,s1,s3,s2]
  32. affichSamples()
  33. SampleList.sort()
  34. affichSamples()


 
Ce qui me donne pour les deux affichSamples():
 

Code :
  1. >>> Liste des Samples:
  2. Hole 10 Sample 104 Depth 6.000000 THM 3
  3. Hole 10 Sample 101 Depth 1.500000 THM 3
  4. Hole 10 Sample 103 Depth 4.500000 THM 3
  5. Hole 10 Sample 102 Depth 3.000000 THM 3
  6. >>> Liste des Samples:
  7. Hole 10 Sample 101 Depth 1.500000 THM 3
  8. Hole 10 Sample 102 Depth 3.000000 THM 3
  9. Hole 10 Sample 103 Depth 4.500000 THM 3
  10. Hole 10 Sample 104 Depth 6.000000 THM 3


 
Voila.
 
Par contre, je ne comprends pas pourquoi je devrais faire hériter ma classe SampleClass d'une classe superieur

Message cité 1 fois
Message édité par xla99 le 06-06-2006 à 15:06:44
Reply

Marsh Posté le 06-06-2006 à 15:20:04    

xla99 a écrit :

Bon, j'ai trouvé la solution
 

Code :
  1. #Creation de la classe Sample
  2. class SampleClass :
  3.     def __init__(self, HoleId, SampleId, Depth, THM):
  4.         self.HoleId=HoleId
  5.         self.SampleId=SampleId
  6.         self.Depth=Depth
  7.         self.THM=THM
  8.     #methode permettant de retourner une representation
  9.     #en string de l'objet
  10.     def __str__(self):
  11.         out = "Hole %d Sample %d Depth %f THM %d" \
  12.  %(self.HoleId, self.SampleId, self.Depth, self.THM)
  13.         return out
  14.    
  15.     #methode de comparaison general basee sur
  16.     #l'attribut Depth
  17.     def __cmp__(self,sample2):
  18.         return cmp(self.Depth, sample2.Depth)
  19. #Liste globale des samples
  20. SampleList = []
  21. #Fonction qui va permettre d'afficher le contenu de ma liste
  22. def affichSamples():
  23.     print"Liste des Samples:\n"
  24.     for samp in SampleList:
  25.         print"\t",samp
  26.            
  27. s1 = SampleClass(10,101,1.5,3)
  28. s2 = SampleClass(10,102,3,3)
  29. s3 = SampleClass(10,103,4.5,3)
  30. s4 = SampleClass(10,104, 6, 3)
  31. SampleList=[s4,s1,s3,s2]
  32. affichSamples()
  33. SampleList.sort()
  34. affichSamples()




Vas lire cette putain de PEP8 bordel [:pingouino]

xla99 a écrit :

Par contre, je ne comprends pas pourquoi je devrais faire hériter ma classe SampleClass d'une classe superieur


parce que ça permet d'utiliser les new-style classes permettant d'utiliser les properties et les métaclasses, et que dans Python 3.0 toutes les classes seront new-style.
http://www.python.org/download/rel [...] escrintro/
http://www.python.org/dev/peps/pep-0252/
http://www.python.org/dev/peps/pep-0253/


Message édité par masklinn le 06-06-2006 à 15:21:20

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-06-2006 à 15:39:29    

Bon, je m'excuse de passer pour un gros naze et de continuer à m'humilier en publique mais la putain de PEP8, je l'ai lu en long et en large. (http://www.python.org/dev/peps/pep-0008/) [:pseudoman]  
 
Donc j'ai collé des 4 espaces partout, mes lignes ne font pas plus de 79 caractères, je saute des lignes quand il le faut, je respecte les espaces dans mes expressions et mes déclarations, je colle des commentaires, etc ... Bon, il doit surement y avoir des erreurs de-ci de-là mais de là à s'énerver !
Donc, c'est quoi le putain de problème avec la PEP8 bordel ? Qu'est ce que je ne respecte pas encore dans la présentation de mon code ?
 
Pour les new-style classes et les metaclasses, je vais aller voir cela  :)

Reply

Marsh Posté le 06-06-2006 à 15:47:53    

xla99 a écrit :

Donc j'ai collé des 4 espaces partout, mes lignes ne font pas plus de 79 caractères, je saute des lignes quand il le faut, je respecte les espaces dans mes expressions et mes déclarations, je colle des commentaires, etc ... Bon, il doit surement y avoir des erreurs de-ci de-là mais de là à s'énerver !
Donc, c'est quoi le putain de problème avec la PEP8 bordel ? Qu'est ce que je ne respecte pas encore dans la présentation de mon code ?


les fonctions, variables et attributs doivent être en underscore_separated_lower_case, pas en PascalCase


Message édité par masklinn le 06-06-2006 à 15:49:31

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-06-2006 à 15:47:53   

Reply

Marsh Posté le 09-06-2006 à 14:58:46    

Et y'a pas de docstrings, ce qui est plus gênant.

Reply

Marsh Posté le 09-06-2006 à 15:05:02    

chaica a écrit :

Et y'a pas de docstrings, ce qui est plus gênant.


non


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed