[python]classe + liste dans constructeur ??

classe + liste dans constructeur ?? [python] - Python - Programmation

Marsh Posté le 11-08-2003 à 11:21:56    

salut je suis toujours dans mon projet et je le passe en modelisation object...
 
j'ai donc une classe Projet et je veux faire un constructeur recursif, qui me sort une liste d'objet de type Projet.
 
Les objects crée correspondent à une liste de projet ayant la meme racine
 
 
pour l'instant çà ressemble à:
 

Code :
  1. class Projet:
  2.     def __init__(self,racine):
  3.         sql='select * from projet where parent="'+racine+'"'
  4.         mabase = bdd ()
  5.         curs=mabase.cursor()
  6.         curs.execute(sql)
  7.         for i in curs.fetchall():
  8.             self.sous.append(Projet(str(i[3])))

 
 
et voilà alors le pb c'est que c'est n'importe quoi le self.sous.append, (c'était pour mettre qqchose)
 
Et je voudrais donc savoir comment et où déclarer mon début de liste, et où l'initialiser aussi ?
 
Voili voilou (en fait je me retrouve emmerder parceque si je l'a créer dans le constructeur il me semble qu'elle va etre réinitialiser à chaque nouvelle création d'objet, ce qui ne me plait pas ...  
 
Donc voilà si vous pouviez m'aider :)

Reply

Marsh Posté le 11-08-2003 à 11:21:56   

Reply

Marsh Posté le 11-08-2003 à 11:26:48    

self.sous=[]
 
tu peux le mettre en attribut de classe peut être

Reply

Marsh Posté le 11-08-2003 à 11:28:34    

nan, a chaqe fois tu obtiendras une nouvelle liste.
 
Donc :

Code :
  1. class Projet:
  2.    def __init__(self,racine):
  3.        sql='select * from projet where parent="'+racine+'"'
  4.        mabase = bdd ()
  5.        curs=mabase.cursor()
  6.        curs.execute(sql)
  7.        self.sous = [] ## <==
  8.        for i in curs.fetchall():
  9.            self.sous.append(Projet(str(i[3])))


 
Maintenant ca depends de ce que tu veux faire...
Si tu veux qu'une seule, faut ptete la passer en parametre de ton constructeur ou la declarer en globale (beurk !!).


Message édité par e_esprit le 11-08-2003 à 11:29:55
Reply

Marsh Posté le 11-08-2003 à 11:37:04    

Ouai en fait je ne veux qu'une seule liste !!
 
Puisque dans ma bdd, j'ai une table projet, qui contient bien sur des projets
Avec comme attributs:
 
- idProjet (l'identifiant du projet)
- name (le nom du projet)
- descr (la description du projet)
- parent (l'identifiant du projet parent)
 
J'appelle donc dans un premier temps mon constructeur avec la racine = "1" , il va donc chopper tout les projet qui ont ROOT comme parent, ...  
 
Ensuite pour chaque projet (sous-projet de roor) trouvé , je veux trouver ces sous projet, ainsi de suite ...  
 
Et chaque objet doit être créer en tant qu'objet en java ...  
 
Donc une seule liste contenant des objets projet .. j'éssai vos idées on va voir ce que çà donne :)
 :bounce:  :bounce:

Reply

Marsh Posté le 11-08-2003 à 11:46:00    

ben non, en attribut de classe !
 

Code :
  1. class Foo(object):
  2.     sous=[]
  3.     def __init__(self):
  4.        sous.append("dawa" )
  5. Foo()
  6. Foo()
  7. print Foo.sous


Message édité par Taz le 11-08-2003 à 11:46:49
Reply

Marsh Posté le 11-08-2003 à 11:51:13    

Bon bah j'ai l'impression que çà boucle à l'infini voilà mon code...  
 

Code :
  1. #!/usr/bin/python2
  2. import cgi
  3. import MySQLdb
  4. import os
  5. from param import *
  6. class Projet:
  7.     def __init__(self,curs,racine):
  8.         sql='select * from projet where parent="'+racine+'"'
  9.         curs.execute(sql)
  10.         self.ListProjet = [] ## <==
  11.         for i in curs.fetchall():
  12.             self.ListProjet.append(Projet(curs,str(i[3])))
  13. class Load:
  14.     def __init__(self,curs):   
  15.         print "Content-type: text/html; charset=iso-8859-1"
  16.         print ""     
  17.         print '''
  18.         <html>
  19.         <body>
  20.         '''
  21.         myprojet=Projet(curs,"1" )
  22.         print '''
  23.         </body>
  24.         </html>
  25.         '''
  26. conn=MySQLdb.connect(host=HOST,db=DBNAME,user=DBUSER,passwd=DBPASSWD)
  27. curs=conn.cursor()
  28. loading=Load(curs)
  29. curs.close()

 
 

Reply

Marsh Posté le 11-08-2003 à 11:56:38    

normal. et moi tu me lis?

Reply

Marsh Posté le 11-08-2003 à 11:58:21    

En fait quand je lance mon script avec la commande python il me sort çà en gros:  

Code :
  1. ...
  2. File "projet.py", line 14, in __init__
  3.     self.ListProjet.append(Projet(curs,str(i[3])))
  4.   File "projet.py", line 14, in __init__
  5.     self.ListProjet.append(Projet(curs,str(i[3])))
  6.   File "projet.py", line 14, in __init__
  7.     self.ListProjet.append(Projet(curs,str(i[3])))
  8.   File "projet.py", line 14, in __init__
  9.     self.ListProjet.append(Projet(curs,str(i[3])))
  10.   File "projet.py", line 14, in __init__
  11.     self.ListProjet.append(Projet(curs,str(i[3])))
  12.   File "projet.py", line 14, in __init__
  13.     self.ListProjet.append(Projet(curs,str(i[3])))
  14.   File "projet.py", line 12, in __init__
  15.     curs.execute(sql)
  16.   File "/usr/lib/python2.2/site-packages/MySQLdb/cursors.py", line 95, in execute
  17.     return self._execute(query, args)
  18.   File "/usr/lib/python2.2/site-packages/MySQLdb/cursors.py", line 114, in _execute
  19.     self.errorhandler(self, exc, value)
  20.   File "/usr/lib/python2.2/site-packages/MySQLdb/connections.py", line 33, in defaulterrorhandler
  21.     raise errorclass, errorvalue
  22. RuntimeError: maximum recursion depth exceeded

Reply

Marsh Posté le 11-08-2003 à 11:59:07    

Ouai taz, j'ai essayé ta solution aussi , en metant la liste en variable de classe et çà fait pareil,  
 
Mais atten je vérifie la sortie d'erreur c'est peut etre pas la meme
 
J'dit mon post: Bah si en fait c pareil !!!  :pt1cable:


Message édité par protoinou le 11-08-2003 à 11:59:29
Reply

Marsh Posté le 11-08-2003 à 12:03:50    

1) t'es que que ta récursion est pas infinie
2) on peut augmenter la profondeur de récursion (et y a un script dans les exemples livrés avec Python genre, find_rec_max_depth)
3) ben sinon, tu fais sauter la récursion, ou bien tu la gère autrement. tu te debrouilles pour faire toutes tes requetes d'abord, et ensuite, à partir de cette liste de resultat, tu crées tes projets. je suis pas sur que ça soit faisable de casser la récursion, tu n'auras qu'a la simuler avec une pile

Reply

Marsh Posté le 11-08-2003 à 12:03:50   

Reply

Marsh Posté le 11-08-2003 à 12:03:52    

ProToinou a écrit :

Ouai taz, j'ai essayé ta solution aussi , en metant la liste en variable de classe et çà fait pareil,  
 
Mais atten je vérifie la sortie d'erreur c'est peut etre pas la meme
 
J'dit mon post: Bah si en fait c pareil !!!  :pt1cable:  


 
 
 :sarcastic:  :ouch:  
Non en fait c pas la meme sortie d'erreur;
 
Voilà le code:
 

Code :
  1. #!/usr/bin/python2
  2. import cgi
  3. import MySQLdb
  4. import os
  5. from param import *
  6. class Projet:
  7.     ListProjet=[]
  8.     def __init__(self,curs,racine):
  9.         sql='select * from projet where parent="'+racine+'"'
  10.         curs.execute(sql)
  11.         for i in curs.fetchall():
  12.             ListProjet.append(str(i[3]))
  13.             print str(i[3])
  14. class Load:
  15.     def __init__(self,curs):   
  16.         print "Content-type: text/html; charset=iso-8859-1"
  17.         print ""     
  18.         print '''
  19.         <html>
  20.         <body>
  21.         '''
  22.         myprojet=Projet(curs,"1" )
  23.         print '''
  24.         </body>
  25.         </html>
  26.         '''
  27. conn=MySQLdb.connect(host=HOST,db=DBNAME,user=DBUSER,passwd=DBPASSWD)
  28. curs=conn.cursor()
  29. loading=Load(curs)
  30. print Projet.ListProjet
  31. curs.close()

 
et l'erreur associée:
 
 

Code :
  1. Traceback (most recent call last):
  2.   File "projet.py", line 34, in ?
  3.     loading=Load(curs)
  4.   File "projet.py", line 26, in __init__
  5.     myprojet=Projet(curs,"1" )
  6.   File "projet.py", line 14, in __init__
  7.     ListProjet.append(str(i[3]))
  8. NameError: global name 'ListProjet' is not defined

 
 
 :pt1cable:  :pt1cable:  :pt1cable:

Reply

Marsh Posté le 11-08-2003 à 12:07:14    

Projet.ListProjet
 
je pensais que y avait pas besoin de préciser

Reply

Marsh Posté le 11-08-2003 à 12:09:30    

Taz a écrit :

Projet.ListProjet
 
je pensais que y avait pas besoin de préciser


 
A quel niveau ?

Reply

Marsh Posté le 11-08-2003 à 12:13:42    

Je vais manger je reviens

Reply

Marsh Posté le 11-08-2003 à 14:03:51    

Je suis de retour, tu avais raison il fallait précisez, mais il y'a toujours la boucle je crois ...
 
Je vais vider un peu ma table voir si çà va mieux !!!
 
 

Reply

Marsh Posté le 11-08-2003 à 14:18:55    

Bon c'est bon j'ai trouvé d'où venait l'erreur, en fait je faisait la recusrisvité sur le parent du tuple selectionné alors que j'aurai du le faire sur son identifiant ...
 
Putain j'ai trop de mal à réfléchir là , çà m'énerve ...  
 
Merci pour l'aide en tout cas, çà m'a montré comment mettre la liste en variable global (ou de classe)
 
 
Chao :)
 :bounce:  :bounce:  :hello:  
 
Mais enfin bon çà marche mais çà ne donne pas exactement ce que je voulais non plus mais je pense que je vais trouver quand meme .:)

Reply

Marsh Posté le 11-08-2003 à 14:29:04    

tu voulais faire quoi précisément? moi je trouve ça bizarre ton constructeur récursif. j'aurais plutot fait une fonction de classe (sans self donc) qui remplis la liste de classe d'objet. et c'est cette fonction qui gère la récursivité, etc. tu vois le truc?
 
et pi on n'est pas des PD, je veux voir des new-style classes partout now  [:taz]

Reply

Marsh Posté le 11-08-2003 à 14:29:37    

Je comprends pas bien...
Tu veux quoi au final ???
Parce que la, tu obtiens une liste de tous les projets...
Si c'est ca alors avoir une variable de classe me semble OK (meme si j'aime pas trop ca).
 
Par contre, si tu veux conserver l'arborescence, alors la liste doit etre une propriété de ton objet...

Reply

Marsh Posté le 11-08-2003 à 14:30:07    

Euh une fois que j'ai choppé ma liste d'objet qui reseemble à çà quand je la print:
 

Code :
  1. [<__main__.Projet instance at 0x82253b4>, <__main__.Projet instance at 0x81545fc>, <__main__.Projet instance at 0x822577c>, <__main__.Projet instance at 0x822518c>, <__main__.Projet instance at 0x82257f4>, <__main__.Projet instance at 0x8225444>, <__main__.Projet instance at 0x82253dc>, <__main__.Projet instance at 0x8225584>, <__main__.Projet instance at 0x82259ec>, <__main__.Projet instance at 0x815457c>]

 
 
Comment est ce que je peux l'exploiter ?
Sachant que ce qui m'inporte pour chaque c'est l'id du projet et sa profondeur ainsi que l'ordre qui est important  
 

Reply

Marsh Posté le 11-08-2003 à 14:30:51    

Taz a écrit :

tu voulais faire quoi précisément? moi je trouve ça bizarre ton constructeur récursif. j'aurais plutot fait une fonction de classe (sans self donc) qui remplis la liste de classe d'objet. et c'est cette fonction qui gère la récursivité, etc. tu vois le truc?
 
et pi on n'est pas des PD, je veux voir des new-style classes partout now  [:taz]  


J'vois qu'on est deux a pas trouvé ca très clair :heink:  

Reply

Marsh Posté le 11-08-2003 à 14:32:43    

ben tu surcharges __repr__ ou __str__

Reply

Marsh Posté le 11-08-2003 à 14:34:00    

e_esprit a écrit :

Je comprends pas bien...
Tu veux quoi au final ???
Parce que la, tu obtiens une liste de tous les projets...
Si c'est ca alors avoir une variable de classe me semble OK (meme si j'aime pas trop ca).
 
Par contre, si tu veux conserver l'arborescence, alors la liste doit etre une propriété de ton objet...


 
 
Ouai alors les gars moi je sais exactement ce que je veux, c'est juste que mon boss m'a imposé cette putain de méthode de constructeur récursif (euh bien sûr je ne lui en veux pas, car il est plutôt super cool avec moi, et il est carrément à un niveau bien au dessus du mien remarque y'a pas de mal)
 
Enfin bref moi ce que je veux c'est récuperé une liste de mes projets, .. de manière à pouvoir exploiter cette liste plus tard afin de dessiner cette liste en html sous forme d'arboréscence (c'est ce que j'avais réussit à faire mais sans passé par une reflexion orientée objet, et c'est trop crade du coup)
 
 
Enfin si vous voulez bien m'exposer clairement comment vous voyez les choses, je ferai comme vous dite et on verra après, je pense que si çà marche et que c'est propre mon boss ne dira rien)

Reply

Marsh Posté le 11-08-2003 à 14:41:17    

ben comme je t'ai dit. methode statique (de classe et pas d'instance) qui remplis la liste de classe en créant une foultitude de Projet. apres tu surcharges __str__(self) pour Porjet et t'as un joli affichage

Reply

Marsh Posté le 11-08-2003 à 14:45:05    

Taz a écrit :

ben comme je t'ai dit. methode statique (de classe et pas d'instance) qui remplis la liste de classe en créant une foultitude de Projet. apres tu surcharges __str__(self) pour Porjet et t'as un joli affichage


 
 
Ouai alors là TAZ tu oublies un paramêtre c'est que moi je suis un newbie en Python et en orienté objet, et là j'ai du mal à bien saisir, si tu as le temps et l'envi, est ce que tu peux m'explqier brievement ?

Reply

Marsh Posté le 11-08-2003 à 14:47:09    

Taz a écrit :

ben comme je t'ai dit. methode statique (de classe et pas d'instance) qui remplis la liste de classe en créant une foultitude de Projet. apres tu surcharges __str__(self) pour Porjet et t'as un joli affichage


Je tiens juste a dire que je trouve ca bizarre de placer ca dans le constructeur...
 
Perso si c'est juste une histoire d'affichage, ta recursivité je la placerai dans la méthode __str__
 
De plus, le fait de créer la liste te fait perdre toute trace de l'arborescence, non ?
 

Reply

Marsh Posté le 11-08-2003 à 14:51:27    

e_esprit a écrit :


Je tiens juste a dire que je trouve ca bizarre de placer ca dans le constructeur...
 
Perso si c'est juste une histoire d'affichage, ta recursivité je la placerai dans la méthode __str__
 
De plus, le fait de créer la liste te fait perdre toute trace de l'arborescence, non ?
 
 


 
Je ne sais pas de toute façon pour l'instant je n'ai aucune trace d'arborescence, l'idée serait peut etre d'incrémenter une variable profondeur à chaque itération,, pour avoir la profondeur dans l'arbre ...
 
Mais voilà encore une fois j'attends vos idée sur la question  
 
Au fait c'est quoi la méthode __str__ ... lol laisse tomber pour çà je vais lire si çà existe ,çà doit bien être écrit qque part !!!
 
Bah non putain y'a pas de çà dans ma doc, en tout cas pas dans l'index, et j'ai pas envo de me taper les 800 pages pour le trouver, mais çà doit etre du coté de l'__init__ non ?
 
Je me gourre là ?


Message édité par protoinou le 11-08-2003 à 14:53:38
Reply

Marsh Posté le 11-08-2003 à 14:53:37    

Code :
  1. class Projet(object):
  2. liste=[]
  3. def Do():
  4.  # la tu fais ta récursion
  5.  # ou si tu y arrives tu la casse
  6.  for truc in sql:
  7.   for machin dans truc:
  8.    Projet.liste.append(Projet(machin))
  9. def __str__(self):
  10.  return "Hello, i am %s %s" % (typed(self), id(self))

Reply

Marsh Posté le 11-08-2003 à 14:54:36    

ProToinou a écrit :


Au fait c'est quoi la méthode __str__ ... lol laisse tomber pour çà je vais lire si çà existe ,çà doit bien être écrit qque part !!!

pour convertir en chaine et donc faire de l'affichage

Reply

Marsh Posté le 11-08-2003 à 15:01:18    

Et donc apres il faut faire un monprojet.liste._str__() ??
 
c'est çà ou pas ?

Reply

Marsh Posté le 11-08-2003 à 15:02:29    

non. comme tout ce qui est __truc__ c'est des opérateurs à surchargé.
 
 
essaye
 
p=Projet()
 
print p

Reply

Marsh Posté le 11-08-2003 à 15:04:47    

Taz a écrit :

non. comme tout ce qui est __truc__ c'est des opérateurs à surchargé.
 
 
essaye
 
p=Projet()
 
print p


 
c'est quoi que tu appelle des opérateurs à surcharger ??  
C'est des trucs qui vont faire que le comportement de la commande print va se trouver modifier, par exemple ?
 

Reply

Marsh Posté le 11-08-2003 à 15:09:47    

Bon je vais lire la doc complete de python.org sur le langage orienté objet avec python parceque là çà ne va pas ..  
je suis à la masse c'est trop grave ...
 
Merci de l'aide en tout cas, à plus quand j'en saurai un peu plus

Reply

Marsh Posté le 11-08-2003 à 15:14:52    

essaye!

Reply

Marsh Posté le 11-08-2003 à 15:21:13    

Putain c'est vraiment pas évident, je ne suis pas une grosse merde en anglais mais là, çà parle d'un concept quand meme assez fort qu'est le langage orienté objet, ...  
Et forcément je ne connais pas la signification de tous les mots anglais, alors çà este compliqué à comprendre, ...
 
ça fait chier ..  

Reply

Marsh Posté le 11-08-2003 à 15:41:05    

Bon faut m'aider j'ai un peu près lu là, mais çà ne va pas m'aider bcp...
 
Comment feriez vous conraitement vous ...???  
 
Je repete ce que je veux exactement ...
 
Je veux présenter sous forme d'arbre, l'arboresscence de projet et de sous projet à l'aide d'un code orienté objet.
 
A coté de çà les taches et projets sont rangés sans des tables différentes ...
 
Voici la table projet
 

Code :
  1. +----------+-------------+------+-----+---------+----------------+
  2. | Field    | Type        | Null | Key | Default | Extra          |
  3. +----------+-------------+------+-----+---------+----------------+
  4. | idProjet | int(11)     |      | PRI | NULL    | auto_increment |
  5. | name     | varchar(50) |      | UNI |         |                |
  6. | descr    | text        | YES  |     | NULL    |                |
  7. | parent   | int(11)     | YES  |     | NULL    |                |
  8. +----------+-------------+------+-----+---------+----------------+


Et voici la table tache:
 
 

Code :
  1. +----------+-------------+------+-----+---------+----------------+
  2. | Field    | Type        | Null | Key | Default | Extra          |
  3. +----------+-------------+------+-----+---------+----------------+
  4. | idTask   | int(11)     |      | PRI | NULL    | auto_increment |
  5. | name     | varchar(50) |      |     |         |                |
  6. | descr    | text        | YES  |     | NULL    |                |
  7. | eval     | text        | YES  |     | NULL    |                |
  8. | idProjet | int(11)     |      |     | 0       |                |
  9. +----------+-------------+------+-----+---------+----------------+

 
 
D'autre part l'affichage de l'arbre des projet/taches ne se fera pas toujours de la meme manière.
 
Pour certaines pages on voudra avoir l'affichage des projets qui ne sont définis que dans la table preference pour un utilisateur donné.
Dans un autre cas ou vondra la l'arbre de tout les projet et taches qques soit l'utilisateur connecté, ...
 
 
Voici la table preference
 

Code :
  1. +-----------+-------------+------+-----+---------+-------+
  2. | Field     | Type        | Null | Key | Default | Extra |
  3. +-----------+-------------+------+-----+---------+-------+
  4. | idUser    | varchar(10) | YES  |     | NULL    |       |
  5. | idProject | int(11)     | YES  |     | NULL    |       |
  6. | idTask    | int(11)     | YES  |     | NULL    |       |
  7. +-----------+-------------+------+-----+---------+-------+

Reply

Marsh Posté le 11-08-2003 à 15:47:46    

Bah c'est une arborescence...
Donc chaque projet a 0 ou plusieurs liste de sous-projets => liste pour chaque projet (la premiere methode que tu avais choisie).
 
Par contre, evite le print dans le constructeur, c'est pas très propre.

Reply

Marsh Posté le 11-08-2003 à 15:55:56    

Rooh c'est bon çà m'énerve je ne vais pas passer par des listes, je vais direcetement faire le traitement avec la base.

Reply

Marsh Posté le 11-08-2003 à 15:59:36    

Juste une petite question comment est ce qu'on peut attribué une valeur à une variable d'une classe à une autre avec python ?

Reply

Marsh Posté le 11-08-2003 à 16:19:24    

ProToinou a écrit :

Juste une petite question comment est ce qu'on peut attribué une valeur à une variable d'une classe à une autre avec python ?
 


TaClasse.taVariable = taValeur

Reply

Marsh Posté le 12-08-2003 à 10:21:42    

Taz a écrit :

tu voulais faire quoi précisément? moi je trouve ça bizarre ton constructeur récursif. j'aurais plutot fait une fonction de classe (sans self donc) qui remplis la liste de classe d'objet. et c'est cette fonction qui gère la récursivité, etc. tu vois le truc?
 
et pi on n'est pas des PD, je veux voir des new-style classes partout now  [:taz]  


 
Au fait c'est quoi des new style classe ?
Et est ce que tu peux me redire comment on fait pour récuperer les informations sur les objets créés...
 
Et aussi comment je peux faire pour que pour chaque objet crée il y ai, une variable profondeur, id, ... ???

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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