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 :

Retrouver le nom (instance) d'un objet. La meilleure façon ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert 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
    Par défaut Retrouver le nom (instance) d'un objet. La meilleure façon ?
    Bonjour,

    Dans le cadre d'une classe je récupère le nom donné pour l'utiliser par la suite avec:

    a=varclass()
    ou
    varclass(name='a')

    Puis dans la classe proprement dite (par exemple car j'ai tester plusieurs solutions):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if name:
                self._name = name
            else:
                self._name = str(inspect.stack()[1][4]).partition('=varclass(')[0][2:].replace(' ', '').replace('self.', '') # Moche
    Pour name= pas de problème mais pour a=varclass() j'ai plusieurs solutions (inspect et autre) et je me demande quelle est la solution la plus propre (et surtout la plus fiable).
    Je dois dire qu'a force de chercher une solution élégante je me suis légèrement perdu et que s'il y a une solution toute simple je ne la vois plus...
    Que me recommandez vous ?

    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    self.__class__.__name__?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert 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
    Par défaut
    Bonjour wiztricks,

    self.__class__.__name__ retourne le nom de la classe. Ce que je recherche c'est le nom de l'objet dans le dico:
    a=truc()

    Je vais toutefois regarder cela de plus prêt. J'y trouverais peut être ma réponse.

    Merci

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    globals()['a'] ?
    Mais, pour l'instant, je ne comprends pas trop ce que tu veux.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    J'imagine que ce qui est souhaité c'est récupérer le nom de utilisé dans le programme pour utiliser une nouvelle instance de classe si j'ai bien compris.

  6. #6
    Membre Expert 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
    Par défaut
    Exactement rambc.

    Pour le moment je n'ai que des exemples avec inspect ou sys.
    Mais ce n'est que du 'bidouillage' tel que dans mon exemple.

  7. #7
    Membre Expert
    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
    Par défaut
    Bonjour,
    pour moi il n'y a pas de solution vraiment propre, c'est toujours un hack, car en réalité quand tu écris a=Truc(), a n'est pas le nom de l'objet mais de la variable qui référence cet objet.
    Si ensuite tu écris b=a, est-ce que l'objet possède deux noms, a et b ?
    Et si j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    l = []
    l.append(Truc())
    quel est le nom de l'objet dans ce cas ?

  8. #8
    Invité de passage
    Homme Profil pro
    Reconversion
    Inscrit en
    Août 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Août 2021
    Messages : 1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MyClass:
        def __init__(self, name):
            self.name = name
     
    x = MyClass('y')
    print(x.__class__.__name__)
    Output => MyClass

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

    Dans l'instruction x = MyClass('y'), la référence à l'instance de MyClass sera x et c'est ce x qu'on souhaiterait (ici) récupérer (et pas juste le nom de la classe).

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

  10. #10
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2022
    Messages : 1
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonjour,

    Dans le cadre d'une classe je récupère le nom donné pour l'utiliser par la suite avec:

    a=varclass()
    ou
    varclass(name='a')

    Puis dans la classe proprement dite (par exemple car j'ai tester plusieurs solutions):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if name:
                self._name = name
            else:
                self._name = str(inspect.stack()[1][4]).partition('=varclass(')[0][2:].replace(' ', '').replace('self.', '') # Moche
    Pour name= pas de problème mais pour a=varclass() j'ai plusieurs solutions (inspect et autre) et je me demande quelle est la solution la plus propre (et surtout la plus fiable).
    Je dois dire qu'a force de chercher une solution élégante je me suis légèrement perdu et que s'il y a une solution toute simple je ne la vois plus...
    Que me recommandez vous ?

    Merci d'avance.
    Si la variable est d'un seul caractère, il suffit de faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if name:
                self._name = name
            else:
                self._name = str(inspect.stack()[1][4][0][0])
    Si c'est plus d'un seul caractère, faut récupérer la chaine de caractère avec str(inspect.stack()[1][4][0]) puis faire du regex afin de récupérer les caractère avant le nom "varclass" qui est biensût le nom de votre class (qui ne change pas). Supprimer également le signe "="

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

Discussions similaires

  1. retrouver le nom du lecteur CD-ROM
    Par Leishmaniose dans le forum Modules
    Réponses: 11
    Dernier message: 24/01/2006, 20h36
  2. Comment netstat retrouve le nom d'un process ?
    Par seal3 dans le forum Linux
    Réponses: 5
    Dernier message: 17/11/2005, 14h25
  3. Réponses: 3
    Dernier message: 03/11/2005, 16h04
  4. Sauver l'instance d'un objet dans un TMemoryStream
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 11/09/2005, 09h23
  5. Retrouver le nom d'un utilisateur qui a verrouillé une ligne
    Par Laurent Dardenne dans le forum Administration
    Réponses: 24
    Dernier message: 18/09/2004, 17h01

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