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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    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 : 116
    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 736
    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 736
    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 confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    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 : 116
    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 ?

  4. #4
    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.

  5. #5
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    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 : 116
    Par défaut
    Merci à tous.
    L.P

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 061
    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 061
    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à !

  7. #7
    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.

+ 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