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 :

destructeur d'une classe dérivée du type list


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut destructeur d'une classe dérivée du type list
    Bonjour,

    Mon problème concerne une classe dérivée du type list, avec un destructeur __del__. Cette méthode __del__ n'est pas appelée alors que toutes les références vers l'instance ont été supprimées.

    J'ai fait quelques tests dans l'interpréteur, et le résultat est encore plus incompréhensible.
    Les commentaires ont été rajoutés après.

    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
    22
    23
    24
    25
    26
    27
    >>> class Foo(list):       # dérivation du type list
    ...     def __init__(self):
    ...             print "nouvelle instance"
    ...     def __del__(self):
    ...             print "instance supprimée"
    ... 
    >>> a = Foo()
    nouvelle instance
    >>> del a
    instance supprimée         # jusqu'ici, tout va bien
    >>> 
    >>> a = Foo()
    nouvelle instance
    >>> a
    []
    >>> del a                  # pourquoi __del__ n'est t-il pas appelé ?
    >>> 
    >>> a = Foo()
    nouvelle instance
    >>> a
    instance supprimée         # a n'est pas supprimé ! pourquoi le destructeur est appelé ? comportement différent des lignes ci-dessus...
    []
    >>> del a                  # toujours pas d'appel de __del__
    >>> 
    >>> dir()
    instance supprimée         # ??!!
    ['Foo', '__builtins__', '__doc__', '__name__']
    Si on pouvait m'expliquer la signification de tout ça...
    Merci.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je n'ai pas toute l'explication mais un début:

    Lorsque tu as affiché la variable a dans l'interpréteur, l'appel de del n'est pas effectué tout de suite mais seulement au prochain affichage effectué par la boucle read/eval/print de l'interpréteur; le deuxième affichage de "instance supprimée" correspond à l'appel de del sur la deuxième instance, pas la troisième que tu viens de créer. Cela ne semble pas avoir de rapport avec le fait que la classe hérite de list, cela se produit pour n'importe quelle classe. Je ne sais pas quelle est la cause de cet appel différé, l'interpréteur en mode interactif garde sans doute une référence sur le dernier objet qui a été affiché.

    Cela ne devrait pas se produire dans un programme exécuté hors de l'interpréteur interactif, car dans ce cas, tu n'affiches pas une variable en tapant simplement 'a' mais 'print a' ou qqch dans le genre.

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Salut,

    Citation Envoyé par dividee
    Je n'ai pas toute l'explication mais un début:
    Ça tombe bien, j'ai retrouvé la fin

    En fait, j'avais complètement oublié que lorsqu'on utilise directement l'interpréteur, Python offre un petit outil sympathique, la variable _

    _ prend automatiquement la dernière valeur affichée, donc quand j'affichais mon instance, la référence vers cette instance était copiée dans _ et c'est pourquoi la méthode __del__ n'était pas appelée car la référence _ existait toujours (et disparaissait au prochain coup, d'où le décalage constaté).

    Merci pour ton aide , en effet ça n'a rien à voir avec la dérivation d'un type intégré.

    Je sais maintenant que l'origine de mon problème vient d'autre part, je n'ai plus qu'à mieux chercher... enfin ce sujet est résolu au moins.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 16/08/2012, 13h59
  2. préciser le type des objets dans une classe dérivée d'arraylist
    Par JCD21 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 28/06/2008, 18h04
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  4. Conseil du compilo sur un destructeur d'une classe
    Par okparanoid dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2005, 20h11
  5. Déterminer le type d'une class dérivée
    Par LDDL dans le forum MFC
    Réponses: 3
    Dernier message: 10/12/2004, 17h36

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