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 :

Conditions de destruction des instances de classes


Sujet :

Python

  1. #1
    Membre confirmé Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Par défaut Conditions de destruction des instances de classes
    Salut,

    Je me pose une question qui, après qq recherches, n'a toujours pas de réponse.

    J'ai le code:
    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
     
    class a:
        def __init__(self, name = "default"):
            self.name = name
            print "creation de " + self.name
            self.l = []
     
        def __del__(self):
            print "destruction de " + self.name
     
    def fct():
        obj1 = a("test1")
        print obj1
        obj2 = a("test2")
        print obj2
        obj1.l.append(obj2)
        del obj2
        print obj1.l[0]
        return
     
    fct()
    j'ai la sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    creation de test1
    <__main__.a instance at 0x00AAAF80>
    creation de test2
    <__main__.a instance at 0x00AAAFD0>
    <__main__.a instance at 0x00AAAFD0>
    fin
    destruction de test1
    destruction de test2
    On voit que le destructeur n'est pas appele au moment ou j'appel del obj2 et je peux toujours afficher son identifiant. Pourquoi ?
    Visiblement les deux objets obj1.l[0] et obj2 pointent au meme endoit et ils sont internes a la focntion alors je devrai pouvoir les supprimer non ?
    et la suppression de l'un devrait empecher l'acces a l autre en toute logique ?!

    Le but finale de la chose est de creer une liste d instances de a contenues dans la liste membre d'un a "conteneur" et, a l aide d'une exception, gerer un echec a la creation et immediatement la destruction de l'objet mal cree.

    J'espere ne pas avoir ete trop confus.

    Merci d'avance.

    +++

    PS: J'ai quand meme recherche dans un paquet de docs et dans des tutoriaux mais malheureusement, comme dit plus haut, rien de repond a cette question (ou alor je ne l ai pas compris)

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 118
    Par défaut
    Est-ce que par hasard, tu fais du C ou C++ ?
    Car le "del" de Python n'est pas du tout équivalent au "delete" de C++ ou au "free" du C: en Python c'est le garbage collector qui gère la mémoire, grosso modo il libère la mémoire lorsque plus aucune référence n'existe sur un objet, et en plus il libère la mémoire "quand çà lui chante" c'est à dire pas forcément dès après que la dernière référence ait disparu.

    "del" en Python ne fait que supprimer la référence sur un objet, mais l'objet n'est pas supprimé. P.ex. dans ton exemple, l'instruction "del obj2" supprime la référence du nom "obj2" sur l'objet qui se trouve à l'adresse "0x00AAAFD0". Mais cet objet est encore référencé par le nom "obj1.l[0]" donc le garbage collector ne va pas détruire ce qui se trouve à l'adresse "0x00AAAFD0".
    Ce n'est que lorsque le programme se termine que toute référence sur "0x00AAAFD0" disparaît, et c'est donc seulement alors que le garbage collector va libérer la mémoire. Et c'est seulement à ce moment que le destructor sera appelé.

    Je ne suis peut-être pas très clair, mais p.ex. si je modifie ton exemple:
    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
    class a:
        def __init__(self, name = "default"):
            self.name = name
            print "creation de " + self.name
            self.l = []
     
        def __del__(self):
            print "destruction de " + self.name
     
    def fct():
        obj1 = a("test1")
        print obj1
        obj2 = a("test2")
        print obj2
        #obj1.l.append(obj2)
        del obj2
        print 'obj2 a été déréférencé'
        #print obj1.l[0]
        return
     
    fct()
    Voici l'output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    creation de test1
    <__main__.a instance at 0x00956850>
    creation de test2
    <__main__.a instance at 0x009566E8>
    destruction de test2
    obj2 a été déréférencé
    destruction de test1
    "obj2" était la seule référence sur "0x009566E8", et dès que j'ai supprimé cette référence, le destructor a été appelé par le garbage collector et non pas par l'instruction "del"!
    Dans ce cas, le garbage collector a appelé le destructor avant l'instruction "print" qui suivait, mais rien ne te garanti que ce sera toujours le cas.

  3. #3
    Membre confirmé Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Par défaut
    Ahhh ok.
    Je comprends beaucoup mieux, merci beaucoup.
    Oui j'ai peux etre ete influence par les operateurs du C/C++.
    Il n'y a aucun autre moyen de supprimer un objet que de detruire toutes ses references ?
    Ca ne risque pas de causer des fuites de memoire ca ?
    Bon faut que je reecrive mon code differement si c'est le cas pour que ce soit propre.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 118
    Par défaut
    Citation Envoyé par elvivo
    Il n'y a aucun autre moyen de supprimer un objet que de detruire toutes ses references ?
    Ca ne risque pas de causer des fuites de memoire ca ?
    Au contraire!
    Le principe c'est que le garbage collector gère tout seul la mémoire, et le programmeur ne doit pas du tout s'en occuper. Et c'est plus sûr comme çà

  5. #5
    Membre confirmé Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Par défaut
    D'accord.
    Je vais me retenir pour le laisser faire sa sauce tout seul ^^

    Merci beaucoup en tout cas.

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

Discussions similaires

  1. [XL-2007] Perte des instances de classe
    Par JLP64 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/10/2011, 10h07
  2. [Flex4] Comment copier des instances de classes différentes ?
    Par tristoon dans le forum Flex
    Réponses: 3
    Dernier message: 26/01/2011, 11h31
  3. Créer des instances de classes EMF dans Eclipse avec une jolie IHM
    Par obernard dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 24/02/2009, 19h21
  4. Envoyer des instances de classes via TCP
    Par ZouBi dans le forum C++
    Réponses: 8
    Dernier message: 02/08/2008, 17h07
  5. Réponses: 6
    Dernier message: 23/02/2006, 20h23

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