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 :

nom de l'objet instancié ?


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 113
    Par défaut nom de l'objet instancié ?
    Salut à tous,
    Dans le bout de code ci-après, j'aurais souhaité savoir s'il est possible d'obtenir de le nom de l'objet instancié.
    Dans cet exemple afficher:

    r1 perimetre = 18
    et
    r2 perimetre = 30

    pour différencier automatiquement les 2 résultats.

    On voit bien dans la réponse que les adresses sont différentes.

    Comment donc en obtenir le nom sans avoir à rajouter un paramètre contenant ce nom à la classe?
    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
     
    class Rectangle(object):
        def __init__(self,L, l):
            self.longueur = L
            self.largeur = l
            self.nom = object()
     
     
        def perimetre(self):
            print("perimetre=", self.longueur * 2 + self.largeur * 2)
            print("nom de l'instance:", self.nom)
     
     
    r1=Rectangle(4,5)
    r2=Rectangle(7,8)
    r1.perimetre()
    r2.perimetre()
    ce qui est renvoyé:
    >>>
    perimetre= 18
    nom de l'instance: <object object at 0x00000000022EE190> ## ici donc, au lieu de l'adresse j'aurais souhaité le nom ('r1')
    perimetre= 30
    nom de l'instance: <object object at 0x00000000022EE1A0>
    >>>

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Salut,

    Citation Envoyé par luc pic Voir le message
    Comment donc en obtenir le nom sans avoir à rajouter un paramètre contenant ce nom à la classe?
    Lorsque vous écrivez r1 = Rectangle(4,5) "r1" est la variable associée à l'instance de l'objet Rectangle créé. Si vous écrivez ensuite: r999 = r1, "r999" sera une autre variable associée au même objet.
    Pour donner un nom à vos objets, il faut le faire explicitement:
    r1 = Rectangle(4,5, 'r1')et le gérer proprement coté code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Rectangle(object):
        def __init__(self,L, l, nom):
            ...
            self.nom = nom
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur backend (python)
    Inscrit en
    Mai 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur backend (python)

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Par défaut
    Si je comprend bien, tu veux récupérer le nom de la variable contenant ton objet.

    D'après ce que j'ai pu voir, c'est impossible, ou alors il faut passer par des variable global mais je te le déconseille.
    C'est impossible du fait que le scope local contenant les variables n'est pas le même pour ton objet et pour ta variable contenant ton objet.

    La seule solution reste donc de passer le nom de ta variable en argument à ta classe pour le récupérer dans un paramètre name.

  4. #4
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 113
    Par défaut
    La question était:

    Comment donc en obtenir le nom sans avoir à rajouter un paramètre contenant ce nom à la classe?

    Bien sûr, si ce n'est pas possible de l'obtenir autrement... Mais c'est justement ce que je voulais éviter.

    Simple curiosité!
    Dois-je en conclure que ce n'est pas possible ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur backend (python)
    Inscrit en
    Mai 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur backend (python)

    Informations forums :
    Inscription : Mai 2014
    Messages : 77
    Par défaut
    La réponse est bien celle-là, c'est impossible.

  6. #6
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 113
    Par défaut
    Merci à tous.
    L.P

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    C'est un problème de conception, il n'y a pas d'intérêt à connaître ce nom de variable, et si tu souhaites l'avoir c'est que tu as créé ton code sur de mauvaises fondations.

    Il est possible dans un environnement global (si les variables ne sont pas créées dans une fonction par exemple) de connaître ce nom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A:
        pass
     
    a = A()
     
    my_vars = dict(globals())
     
    for var, obj in my_vars.items():
        if isinstance(obj, A):
            print(var)
    Cependant c'est contre productif, inutile et absolument pas à utiliser, c'est dire qu'avec python on peut tout faire même ce qu'il ne faut pas.

    Bref pour la culture, mais ça en reste là !

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonsoir,

    les frames qui permettent de générer les traceback par exemple permet de faire ça.


    docs.python.org: sys._getframe([depth])

    docs.python.org: inspect

    Citation Envoyé par CPython implementation detail:
    This function should be used for internal and specialized purposes only. It is not guaranteed to exist in all implementations of Python.
    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
    import sys # System-specific parameters and functions
     
    class Rectangle(object):
        def __init__(self, L, l):
            self.longueur = L
            self.largeur = l
     
        def perimetre(self):
            frame = sys._getframe(1) # depth = 1
            f_locals = frame.f_locals # local namespace seen by this frame
            instance_var_name = ""
            for local_name, local_object in f_locals.items():
                if local_object is self:
                    instance_var_name = local_name
                    break
     
            print("Perimetre=", self.longueur * 2 + self.largeur * 2)
            print("Nom de l'instance:", self.__class__.__name__, instance_var_name)
     
    def test():
        r3=Rectangle(10, 11)
        r3.perimetre()
     
    r1=Rectangle(4, 5)
    r2=Rectangle(7, 8)
    r1.perimetre()
    r2.perimetre()
    test()
    Perimetre= 18
    Nom de l'instance: Rectangle r1
    Perimetre= 30
    Nom de l'instance: Rectangle r2
    Perimetre= 42
    Nom de l'instance: Rectangle r3

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

Discussions similaires

  1. Plusieurs objets instanciés, un seul nom ?
    Par Faluchard dans le forum Général Java
    Réponses: 7
    Dernier message: 24/08/2011, 10h46
  2. Nom de l'objet instancié
    Par speeddo dans le forum C++
    Réponses: 6
    Dernier message: 10/01/2007, 13h26
  3. Recuperer le nom de l'objet du champ en cours.
    Par gregco1 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/02/2006, 14h36
  4. [c#] nomer nom d'un objet..
    Par orelero dans le forum C#
    Réponses: 9
    Dernier message: 22/12/2005, 19h11
  5. Réponses: 7
    Dernier message: 03/12/2004, 12h40

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