Bonjour à tous - Je viens ici demander une aide suite à un problème qui me turlupine. A force de chercher, j'ai réussi à ramener le problème à un exemple tout simple qui servira de démo facilement compréhensible
Je dois gérer un objet texte. A cet objet y vont s'adjoindre diverses méthodes me permettant de récupérer des infos sur ce texte comme nb lignes, de mots, etc.
A un moment donné, je dois renvoyer un paragraphe du texte. Je me dis en moi-même "un paragraphe étant un mini-texte, si je renvoie une nouvelle instance de mon objet ne contenant que ledit paragraphe, cette instance bénéficiera de toutes les méthodes utiles (nb de lignes, de mots, etc).
Mais c'est là que ça se corse. Voici un petit exemple tout simple montrant le problème. Pour simplifier, j'ai juste créé un objet qui stocke un tableau de nombres et créé une méthode "sort" qui renvoie un nouvel objet contenant le tableau trié
A la base, je crée mon objet. Les affichages sont okCode:
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
41
42
43 #!/usr/bin/env python # coding: Latin-1 -*- class cGestion: def __init__(self): print "init: %s" % repr(self) self.tab=[] def __del__(self): print "del: %s" % repr(self) del self.tab[:] del self.tab def __str__(self): return "[%s]: %s" % (repr(self), self.tab) def append(self, k): self.tab.append(k) def sort(self): n=cGestion() for k in self.tab: n.append(k) n.tab.sort() return n # Création élément de base base=cGestion() base.append(2) base.append(1) base.append(0) print "\nbase: ", base # Test 1: copie triée de l'objet de base - la copie est mémorisée cp=base.sort() print "\ntest 1:" , cp, cp.tab del cp # Test 2: affichage juste d'une instance triée print "\ntest 2:", base.sort() # Test 3: affichage d'un élément de l'instance triée print "\ntest 3:", base.sort().tab
Au test 1, je récupère une copie triée de mon objet. Aucun souci
Au test 2, j'affiche juste la copie triée de mon objet mais ne l'ai pas sauvegardée. Cependant aucun souci
Au test 3, là j'affiche le tableau stocké dans la copie au moment de la copie et là, je me rends compte que le destructeur a déjà fait son office et le tableau est vide.
Ce qui est intéressant, c'est que si dans le destructeur on supprime le nettoyage du tableau (del self.tab[:]), là tout marche bien. Je sais que Python possède une gestion de la mémoire et que je ne devrais pas me préoccuper de libération de mon tableau interne mais je suis issu du C et c'est plus fort que moi. Si mon constructeur crée un élément, mon destructeur supprime l'élément.
Quelqu'un aurait un conseil à me donner ?
Merci