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 :

Liste des instances d'une classe


Sujet :

Python

  1. #1
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut Liste des instances d'une classe
    Bonjour à tous,

    Sauriez vous quelle commande permet de donner la liste des instances d'une classe.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Toto:
        def __init__(self,num):
            self.num=num
     
    t1=Toto("un")
    t2=Toto("Deux")
     
    print Toto.?
    ["t1","t2"]
    Merci
    Alex

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Hello Alex,

    Ça ne se fait pas tout seul malheureusement. Mais avec un petit peu de brol, tu peux vite arriver à un résultat convainquant

    Solution simple: mettre un décorateur sur l'__init__ de ta classe, qui va capturer les nouvelles instances.

    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
     
    >>> import functools
     
    >>> class Gatherer(object):
    ...     def __init__(self):
    ...             self.objects = []
    ...     
    ...     def __call__(self, func):
    ...             @functools.wraps(func)
    ...             def newInit(itself, *args, **kwargs):
    ...                     func(itself, *args, **kwargs)
    ...                     self.objects.append(itself) # Ou une weakref
    ...     
    ...             return newInit
    ... 
    >>> g = Gatherer()
     
    >>> class MyClass(object):
    ...     @g
    ...     def __init__(self): pass
    ... 
    >>> MyClass()
    <__main__.MyClass object at 0x1004d2dd0>
    >>> MyClass()
    <__main__.MyClass object at 0x1004d2e90>
    >>> g.objects
    [<__main__.MyClass object at 0x1004d2dd0>, <__main__.MyClass object at 0x1004d2e90>]

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    A ma connaissance, il n'y a pas de liste d'instances d'une classe: il faut la construire à la mimine lors de la création des instances.

    Un peu plus light que la solution précédente.
    On met les instances crées dans une liste de classe.
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Toto(object):
        instances = []
     
        def __init__(self,num):
            self.num=num
            self.instances.append(self)
     
        def __del__(self):
            '''c'est bien d'empiler mais...'''
            self.instances.remove(self)
    Ca à l'avantage d'être simple.... Même si je n'aime pas du tout.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Hello

    C'est vrai que c'est une bonne idée de retirer les objets quand ils sont désalloués... Je rajouterai ça à ma todo list

    Ceci dit, il me semble que les objets ne seront jamais désalloués dans ce cas-ci, puisqu'il restera tjs au moins une référence pour chaque objet: celle qui se trouve dans la liste.

    Le problème peut se régler en utilisant des weak refs.

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Citation Envoyé par wiztricks Voir le message
    On met les instances crées dans une liste de classe.
    Sauf que l'item reste dans la liste en cas de del de la référence.
    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 Toto(object):
     
        instances = []
     
        def __init__(self,num):
            self.num=num
            self.instances.append(self)
     
        def __del__(self):
            self.instances.remove(self)
     
        def getinstances(self):
            return self.instances
     
     
    a = Toto(1)
    Toto(2)
    c = Toto(3)
    print(c.getinstances())
    del c
    d = Toto(4)
    print(d.getinstances())
    for i in d.getinstances():
        del i
    e = Toto(5)
    print(e.getinstances())
    print(Toto.instances)
    C'est normal mais bon...

    @+
    Merci d'utiliser le forum pour les questions techniques.

  6. #6
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Bon, je vais utiliser la solution de wiztricks,
    Je n'aurais pas pensé non plus à l'effacement de l'instance...

    Merci,

    Alex

  7. #7
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Ouais, mais comme l'a dit PauseKawa la référence contenu dans la liste n'est pas supprimée, ce qui empêche l'appel de la méthode __del__ de l'objet.

    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
    # -*- coding: cp1252 -*-
    class Toto(object):
        instances = []
     
        def __init__(self,num):
            self.num=num
            self.instances.append(self)
     
        def __del__(self):
            '''c'est bien d'empiler mais...'''
            self.instances.remove(self)
            "Print - Objet : Toto-%d Détruit" % (self.num)
     
    a = Toto(1)
    b = Toto(2)
    del a
    del b
    print (Toto.instances)
    >>>
    [<__main__.Toto object at 0x00F2A490>, <__main__.Toto object at 0x00F2A2F0>]
    >>>
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    weakref ?

  9. #9
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Avec le module <gc>, il est possible de retrouver tous les objects faisant référence à un objet donné.
    Dans le cas de la classe Toto.
    Le léger soucis, c'est d'ensuite mettre au point une fonction récursive qui retourne tous les instances de <Toto> contenu dans cette Liste.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Je vous avais écrit que la chose ne me plaisait pas.

    Les weakrefs bien sûr mais çà rend la chose _compliquée_.
    Si on veut rester simple ajouter une méthode delete en lieu et place de __del__ évite d'attendre indéfiniment l'arrivée du GC.
    Tout dépend de la confiance faite au client (le code qui utilisera la classe Toto) pour penser à...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Toto(object):
         instances = []
         def __init__(self,num):
            self.num=num
            self.instances.append(self)
     
        def delete(self):
            self.instances.remove(self)
    La chose ne me plaît pas plus... Mais restons simple.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Une solution : Utiliser une classe singleton pour stocker/destocker on demand les instances les classes qui le demande dans un objet (dico[classe]: (instance, instance)).
    Pour avoir la liste des instances d'une classe il suffit alors de demander au singleton.
    Pas jolie hein...

    @+
    Merci d'utiliser le forum pour les questions techniques.

  12. #12
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Le singleton c'est mal... Surtout quand on fait du multithreading.

  13. #13
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Oui... Surtout que cela n'arrange en rien l'histoire du __del__, du moins sans trop 'magouiller'.
    Donc restons simple que le dit wiztricks.
    Merci d'utiliser le forum pour les questions techniques.

  14. #14
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Bon pas simple ce truc,
    Il semble plus compliqué d'adresser un seul objet que l'ensemble des objets de classes sans les connaître à priori.
    Quand j'ai un problème comme ceci en général je revois mon réel besoin...

    Je ne comprend pas deux points :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Toto(object):
        instances = []
    "instance" est un attribut de classe, alors pourquoi doit on s'y référer avec self.instances.append(self) puisque que ""self" est un attribut d'instance ?

    Que change le fait d'avoir une méthode delete au lieu de __del__ ?

    Merci de votre aide

    Alex

  15. #15
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Vous pouvez utilisez Toto.instances si cela vous semble plus 'logique'/'propre'.
    Vous avez aussi accès aux attributs de classe via l'instance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> class Toto(object):
    ...     instances = []
    ...     def verifitem(self):
    ...         return hasattr(self, 'instances')
    ...
    >>> c = Toto()
    >>> c.verifitem()
    True
    Et c'est ce qui est fait ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> class Toto(object):
    ...     instances = []
    ...     def __init__(self):
    ...         self.instances.append(self)
    ...     def getitem(self):
    ...         return self.instances
    ...
    >>> t1 = Toto()
    >>> t2 = Toto()
    >>> t3 = Toto()
    >>> t3.getitem()
    [<__main__.Toto object at 0x022FCC30>, <__main__.Toto object at 0x022FCB70>, <__
    main__.Toto object at 0x022FCD30>]
    >>>
    Pour ce qui est de del (et __del__) c'est une histoire de compteur et garbage collector qui prend son temps.
    Utiliser une méthode delete permet d'avoir une liste 'viable' des instances.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Antoine_935 Voir le message
    Le singleton c'est mal... Surtout quand on fait du multithreading.
    Je ne connais pas d'applications qui ne doivent pas avoir des variables globales ici ou là. Une variable "globale", c'est d'abord la possibilité de la désigner via un nom de chemin. module.Toto.instances est une variable "globale".

    Et comme en Python les modules sont techniquement des "Singleton"s... il faudra quand même traiter la sérialisation des accès aux variables globales.

    Deux choses au moins que MonoState / Borg fait mieux que Singleton (en MT) sont:
    - nous avons l'assurance d'avoir un état global unique sans avoir à faire un double verrouillage à la création de l'instance "single" du ton,
    - on peut sous-classer un monostate. Un Singleton c'est plus tordu.

    Une chose que Singleton fait mieux que MonoState, c'est "attention danger!" pourvu qu'on s'applique à rester orthodoxe, i.e. l'interface d'accès reste la méthode de classe singleton.getInstance (pas facile d'obliger à en Python).

    Monostate nous retourne une instance avec des variables partagées sans forcément nous alerter sur la chose.
    Note: C'est un des aspects que je n'aime pas dans ce code.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  17. #17
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    De toute manière l'idée n'est pas bonne (elle est de moi ? Ah ok...).
    Le problème est dans la suppression des références ET des 'instances' dans la liste, pas dans le stockage.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par PauseKawa Voir le message
    Le problème est dans la suppression des références ET des 'instances' dans la liste, pas dans le stockage.
    Pourquoi weakref c'est "compliqué".... parce que je ne sais pas faire plus simple que ci dessous.

    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
    import weakref
     
    class Toto(object):
     
        instances = []
     
        def __init__(self, number):
            self.number = number
            self.instances.append(weakref.proxy(self, Toto._delete))
     
        @classmethod
        def _delete(cls, ref):
            assert ref in cls.instances
            cls.instances.remove(ref)
     
        def __del__(self):
            print ('__del__(%s)' % self)
     
        def __str__(self):
            return 'Toto: number = %(number)d' % vars(self)
     
    t1 = Toto(1)
    print 't1:', t1
    print 'instances', Toto.instances
    del t1
    print 'instances', Toto.instances


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  19. #19
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Pour ma part j'ai d'un coté:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #coding:latin-1
    #Méthode 2, avec n'importe quelle classe!
    import gc
     
    def getInstances(classRef):
        if classRef in (int, str, float, unicode) or isinstance(classRef,(int,str,float,unicode)):
            raise TypeError("classRef must be a class, not of type %s " % (classRef))
        lst = gc.get_referrers(classRef)
        res = list()
        findAllInstances(classRef, lst, res)
        return res
     
    def findAllInstances(classRef, db , lst):
        if classRef in (int, str, float, unicode):
            raise TypeError("classRef must be a class, not of type <%s> " % (classRef))
        if isinstance(db, (list, tuple, set)):
            for obj in db:
                findAllInstances(classRef, obj, lst)
        elif isinstance(db, dict):
            for obj in db.values():
                findAllInstances(classRef, obj, lst)
        elif isinstance(db, classRef) and not (db in lst):
            lst.append(db)
     
     
    class Toto():
        def __init__(self):
            pass
     
    a = Toto()
    b = Toto()
    db = dict(me=Toto(),you=Toto(),this=Toto(),moi=Toto())
    lst = list(db.values())
    print ("Instances - 1")
    print (getInstances(Toto))
    del (lst, db)
    gc.collect()
    print ("\nInstances - 2")
        print (getInstances(Toto))
    Et de l'autre...
    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
    28
    29
    30
    31
    32
    33
    34
    #coding:latin-1
    #Méthode 1, avec une classe construite par soi-même
     
    import weakref
     
    class Toto:
        __refs = []
        __id = [0]
        def __init__(self):
            self.__refs.append(weakref.ref(self))
            self.id = self.__id[0]
            self.__id[0] +=1
     
        def __del__(self):
            print "Deleted object <%d>" % (self.id)
     
        def getInstances(self):
            res = []
            for ref in self.__refs:
                obj = ref()
                if (obj==None):
                    self.__refs.remove(ref)
                else:
                    res.append(obj)
            return res
     
     
    a = Toto()
    b = Toto()
    db = dict(me=Toto(),you=Toto(),this=Toto(),moi=Toto())
    lst = list(db.values())
    print (a.getInstances())
    del (lst, db)
    print (a.getInstances())
    Le proxy pour les weakref, faudrait m'expliquer, j'ai rien compris.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  20. #20
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Dans l'esprit 'faire simple' weakref.ref n'est il pas suffisant ?
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #!/usr/bin/env python
    # -*- coding: ISO8859-1 -*-
    #
    #
    import weakref
    from sys import version
     
    if version.startswith('3'):
        raw_input = input
     
    class Toto(object):
     
        instances = []
     
        def __init__(self):
            self.ref = weakref.ref(self)
            self.instances.append(self.ref)
     
        def __del__(self):
            self.instances.remove(self.ref)
            print ('__del__(%s)' % self)
     
        def __str__(self):
            return repr(self)
     
    t1 = Toto()
    print('t1:', t1)
    print('instances', Toto.instances)
    t2 = Toto()
    t3 = Toto()
    t4 = Toto()
    t5 = Toto()
    print('instances', Toto.instances)
    del t1
    print('instances', Toto.instances)
    del t2
    del t3
    del t4
    print('instances', Toto.instances)
    raw_input("Fin de code: Appuillez sur une touche pour finir.")
    print("Grand ménage")
    Output
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ('t1:', <__main__.Toto object at 0xb780da6c>)
    ('instances', [<weakref at 0xb78100cc; to 'Toto' at 0xb780da6c>])
    ('instances', [<weakref at 0xb78100cc; to 'Toto' at 0xb780da6c>, <weakref at 0xb78100f4; to 'Toto' at 0xb780daec>, <weakref at 0xb781011c; to 'Toto' at 0xb780db0c>, <weakref at 0xb7810144; to 'Toto' at 0xb780db2c>, <weakref at 0xb781016c; to 'Toto' at 0xb780db4c>])
    __del__(<__main__.Toto object at 0xb780da6c>)
    ('instances', [<weakref at 0xb78100f4; to 'Toto' at 0xb780daec>, <weakref at 0xb781011c; to 'Toto' at 0xb780db0c>, <weakref at 0xb7810144; to 'Toto' at 0xb780db2c>, <weakref at 0xb781016c; to 'Toto' at 0xb780db4c>])
    __del__(<__main__.Toto object at 0xb780daec>)
    __del__(<__main__.Toto object at 0xb780db0c>)
    __del__(<__main__.Toto object at 0xb780db2c>)
    ('instances', [<weakref at 0xb781016c; to 'Toto' at 0xb780db4c>])
    Fin de code: Appuillez sur une touche pour finir.
    Grand ménage
    __del__(<__main__.Toto object at 0xb780db4c>)
    @+

    Edit: Rajout de getinstances
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #!/usr/bin/env python
    # -*- coding: ISO8859-1 -*-
    #
    #
    import weakref
    from sys import version
     
    if version.startswith('3'):
        raw_input = input
     
    class Toto(object):
     
        instances = []
     
        def __init__(self):
            self.ref = weakref.ref(self)
            self.instances.append(self.ref)
     
        def __del__(self):
            self.instances.remove(self.ref)
            print ('__del__(%s)' % self)
     
        def __str__(self):
            return repr(self)
     
        def getinstances(self):
            return [ref() for ref in self.instances]
     
    t1 = Toto()
    print('t1:', t1)
    print('instances', Toto.instances)
    t2 = Toto()
    t3 = Toto()
    t4 = Toto()
    t5 = Toto()
    print('getinstances', t5.getinstances())
    print('instances', Toto.instances)
    del t1
    print('instances', Toto.instances)
    print('getinstances', t5.getinstances())
    del t2
    del t3
    del t4
    print('instances', Toto.instances)
    print('getinstances', t5.getinstances())
    raw_input("Fin de code: Appuillez sur une touche pour finir.")
    print("Grand ménage")
    Merci d'utiliser le forum pour les questions techniques.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WD17] Poo : Liste des instances d'une classe
    Par R&B dans le forum WinDev
    Réponses: 2
    Dernier message: 29/03/2012, 15h22
  2. afficher liste des eleve d'une classe d un tableau T
    Par clem62173 dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 10/11/2009, 12h20
  3. Liste les instances d'une classe
    Par Mucho dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2009, 17h24
  4. Nommer des instances d'une classe dynamiquement ?
    Par Demosis dans le forum Langage
    Réponses: 4
    Dernier message: 04/11/2007, 14h22
  5. Réponses: 9
    Dernier message: 18/10/2007, 20h06

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