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

  1. #1
    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 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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 400
    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 400
    Points : 36 965
    Points
    36 965
    Par défaut
    self.__class__.__name__?
    - W

  3. #3
    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 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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 400
    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 400
    Points : 36 965
    Points
    36 965
    Par défaut
    globals()['a'] ?
    Mais, pour l'instant, je ne comprends pas trop ce que tu veux.
    - W

  5. #5
    Membre chevronné

    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
    Points : 1 751
    Points
    1 751
    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
    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
    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 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
    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
    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,

    Devant l'exemple de dividee je précise: Comment récupérer la référence locale à une classe.

  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 : 33
    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
    Bonsoir,

    @dividee
    Si ensuite tu écris b=a, est-ce que l'objet possède deux noms, a et b ?
    Oui si on fait b=a alors l'objet possède 2 noms : "a" et "b"

    Et si j'écris:
    Code :

    l = []
    l.append(Truc())

    quel est le nom de l'objet dans ce cas ?
    Le nom de l'objet est toujours "l"

    @PauseKawa
    si tu as le nom de la class/fonction/module... je crois que c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reference = locals()[maclasse.__name__]
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reference = locals()["nomdemaclasse"]
    @+

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 400
    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 400
    Points : 36 965
    Points
    36 965
    Par défaut
    Salut,

    Quand on dit:
    Comment récupérer la référence locale à une classe.
    on suppose qu'il existe une sorte de variable unique qui s'appellerait "référence locale à..." et pourquoi y en aurait-il pas plusieurs?

    Oui si on fait b=a alors l'objet possède 2 noms : "a" et "b"
    Pour l'instant, nous avons deux variables "a" et "b" qui ayant la même valeur nous permettront d'accéder au même objet.
    Essayons avec un truc comme a = b = 2.

    L'objet est l'entier "2".
    Que sont a et b?

    Essentiellement des variables, des left-values, ou des identifiants.
    ...et en première approximation, a et b "pointent" vers le même objet non pas si a == b mais si a is b ou id(a) == id(b).
    - W

  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
    Bonsoir,

    Citation Envoyé par afranck64 Voir le message
    @PauseKawa
    si tu as le nom de la class/fonction/module... je crois que c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reference = locals()[maclasse.__name__]
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reference = locals()["nomdemaclasse"]
    @+
    C'est bien le sens de ma question : Comment récupérer dans une classe la référence d'instance.
    Soit dans du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class varclass:
        _default = ""
        def __init__(self, master=None, value=None, name=None, trace=None, mode=None):
    #...
            if name:
                self._name=name
            else:
                self._name=str(inspect.stack()[1][4]).partition('=varclass(')[0][2:].replace(' ', '').replace('self.', '')
            globals()[self._name]=self
    #...
    Je souhaite pouvoir avoir self._name égal à 'a'.

    Je pense que dividee est dans le vrais et que sans inspect ou sys cela n'est pas possible.

    Merci pour toute idée géniale

  12. #12
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    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

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 400
    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 400
    Points : 36 965
    Points
    36 965
    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

  14. #14
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    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