Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer le nom d'objet de classe à son initi.

Sujet résolu
    19 juillet 2021 à 18:57:49

    Bonjour, dans le cadre d'un jeu, j'aimerais dès que j'initialise l'objet de classe, je stock son nom dans une liste. J'ai cherché mais je n'ai pas trouvé. Il y a t-il un moyen ?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      19 juillet 2021 à 19:11:27

      C'est quoi le nom d'objet de classe?
      • Partager sur Facebook
      • Partager sur Twitter
        19 juillet 2021 à 20:00:13

        C'est à dire quand on initialise un objet, par exemple la classe est Test(), on va écrire test1 = Test()

        Comment récupérer le nom test1 ?

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          19 juillet 2021 à 20:02:40

          Ce sujet a déjà été traité, mais quel en est l'intérêt ?
          • Partager sur Facebook
          • Partager sur Twitter
            19 juillet 2021 à 22:36:09

            MaxMlr a écrit:

            C'est à dire quand on initialise un objet, par exemple la classe est Test(), on va écrire test1 = Test()

            Comment récupérer le nom test1 ?

            C'est vous qui codez... et décidé du nom de la variable test1 que vous allez pouvoir réutiliser par la suite. Au cas où vous l'auriez oublié, vous pouvez toujours relire le code pour le retrouver. L'intérêt de la chose est assez limité sauf à vouloir créer des fonctionnalités de debug très spécifiques.

            Si le besoin est d'associer l'instance à une chaine de caractère créer un attribut name et dictionnaire D pour écrire D['test1"] = Test('test1') quitte à faire de D un attribut de la classe Test. Du coup les instances ont un nom et une collection qui permet de... (reste à gérer les doublons).

            • Partager sur Facebook
            • Partager sur Twitter
              20 juillet 2021 à 7:48:48

              Je m'explique, c'est que pour chaque élément quand il est crée soit ajouté à une liste.

              comme ça, j'opère sur chaque élément avec un boucle for au lieu de faire plein de répétitions

              -
              Edité par MaxMlr 20 juillet 2021 à 7:50:14

              • Partager sur Facebook
              • Partager sur Twitter
                20 juillet 2021 à 10:13:05

                MaxMlr a écrit:

                Je m'explique, c'est que pour chaque élément quand il est crée soit ajouté à une liste.

                C'est aussi simple que d'ajouter des entiers à une liste.... et si vous postez pas un peu de code difficile de voir sur quoi vous butez.

                • Partager sur Facebook
                • Partager sur Twitter
                  20 juillet 2021 à 10:15:44

                  bah tu l'ajoutes directement à ta liste.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 juillet 2021 à 16:08:38

                    umfred a écrit:

                    bah tu l'ajoutes directement à ta liste.


                    Oui mais si j'ai 200 éléments je vais pas écrire 200x2 lignes à la main, il y a forcément une solution

                    -
                    Edité par MaxMlr 20 juillet 2021 à 16:32:51

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 juillet 2021 à 16:39:14

                      liste_obj=[]
                      dict_obj={}
                      for i in range(200):
                         t=Test()
                         liste_obj.append(t)
                         dict_obj[i]=t
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 juillet 2021 à 17:02:11

                        umfred a écrit:

                        liste_obj=[]
                        dict_obj={}
                        for i in range(200):
                           t=Test()
                           liste_obj.append(t)
                           dict_obj[i]=t
                        


                        Oui mais ils vont tous s'appeler t

                        Et de toute façon cela ne me gène pas

                        -
                        Edité par MaxMlr 20 juillet 2021 à 17:39:03

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 juillet 2021 à 17:40:39

                          ils n'auront pas de nom, tu les appelera via liste_obj[x] ou dict_obj[x] 

                          Si, comme évoqué plus haut par mps, la classe a un attribut name, tu peux le fournir au dictionnaire

                          class Test():
                              def __init__(self, id, name):
                                  self.id=id
                                  self.name=name
                          ...
                          
                          liste_obj=[]
                          dict_obj={}
                          for i in range(200):
                             t=Test(i,"nom_"+str(i))
                             liste_obj.append(t)
                             dict_obj[t.name]=t
                          print(dict_obj["nom_3"].name)
                          >>>'nom_3'
                          print(dict_obj["nom_3"].id)
                          >>>3



                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 juillet 2021 à 17:49:07

                            umfred a écrit:

                            ils n'auront pas de nom, tu les appelera via liste_obj[x] ou dict_obj[x] 

                            Si, comme évoqué plus haut par mps, la classe a un attribut name, tu peux le fournir au dictionnaire

                            class Test():
                                def __init__(self, id, name):
                                    self.id=id
                                    self.name=name
                            ...
                            
                            liste_obj=[]
                            dict_obj={}
                            for i in range(200):
                               t=Test(i,"nom_"+str(i))
                               liste_obj.append(t)
                               dict_obj[t.name]=t
                            print(dict_obj["nom_3"].name)
                            >>>'nom_3'
                            print(dict_obj["nom_3"].id)
                            >>>3



                            D'accord tout ça j'y avait déjà pensé mais ce que je voulais savoir c'est est-ce qu'on peut faire ça:

                            elements = []
                            
                            class Test():
                                def __init__(self):
                                    elements.append("<nom de l'objet>")
                            
                                
                            test1 = Test()
                            test2 = Test()
                            
                            print(elements)
                            
                            >>> [test1, test2]




                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 juillet 2021 à 19:00:10

                              c'est faisable puisque ça marche (sauf qu'on ne sait toujours pas récupérer le nom de la variable de l'instance dans la classe)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 juillet 2021 à 19:06:31

                                Et à quoi va vous servir cette liste de noms ?

                                Et que faites-vous de la portée des variables ?

                                Et comment allez-vous gérer une réaffectation de variable ?

                                Et pourquoi vous numérotez des variables ?

                                ...

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 juillet 2021 à 20:30:50

                                  MaxMlr a écrit:

                                  D'accord tout ça j'y avait déjà pensé mais ce que je voulais savoir c'est est-ce qu'on peut faire ça:

                                  elements = []
                                  
                                  class Test():
                                      def __init__(self):
                                          elements.append("<nom de l'objet>")
                                  
                                      
                                  test1 = Test()
                                  test2 = Test()
                                  
                                  print(elements)
                                  
                                  >>> [test1, test2]

                                  Le "print" affiche une représentation de la liste sur le terminal... Si on veut que ça affiche les élements de la liste ainsi pourquoi pas? Ce qui est sûr c'est que çà ne le fera pas tout seul (il va falloir coder) et que ça ait un intérêt (pour se motiver à coder).

                                  On peut écrire:

                                  class Test:
                                      id = 0
                                      def __init__(self):
                                          Test.id += 1
                                          self.id = Test.id
                                      def __repr__(self):
                                          return f'Test{self.id}'
                                  
                                  L = [ Test() for _ in range(3) ]
                                  print(L)
                                  

                                  ça affiche [Test1, Test2, Test3] et voilà

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 juillet 2021 à 11:22:30

                                    mps a écrit:

                                    MaxMlr a écrit:

                                    D'accord tout ça j'y avait déjà pensé mais ce que je voulais savoir c'est est-ce qu'on peut faire ça:

                                    elements = []
                                    
                                    class Test():
                                        def __init__(self):
                                            elements.append("<nom de l'objet>")
                                    
                                        
                                    test1 = Test()
                                    test2 = Test()
                                    
                                    print(elements)
                                    
                                    >>> [test1, test2]

                                    Le "print" affiche une représentation de la liste sur le terminal... Si on veut que ça affiche les élements de la liste ainsi pourquoi pas? Ce qui est sûr c'est que çà ne le fera pas tout seul (il va falloir coder) et que ça ait un intérêt (pour se motiver à coder).

                                    On peut écrire:

                                    class Test:
                                        id = 0
                                        def __init__(self):
                                            Test.id += 1
                                            self.id = Test.id
                                        def __repr__(self):
                                            return f'Test{self.id}'
                                    
                                    L = [ Test() for _ in range(3) ]
                                    print(L)
                                    

                                    ça affiche [Test1, Test2, Test3] et voilà

                                    D'accord je vois le principe.

                                    Mais il n'y a vraiment aucun moyen de récupérer le nom sans passer par un nom avec incrémentation ?

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 juillet 2021 à 12:17:53

                                      Tout ceci n'a strictement aucun intérêt. Vous cherchez une solution à un problème qui n’existe pas.

                                      Pouvez-vous réfléchir à ces questions :

                                      Et à quoi va vous servir cette liste de noms ?

                                      Et que faites-vous de la portée des variables ?

                                      Et comment allez-vous gérer une réaffectation de variable ?

                                      Et pourquoi vous numérotez des variables ?

                                      ...

                                      En faite non, voici la question : « Qu'est-ce qu'une variable et à quoi ça sert ? »

                                      -
                                      Edité par .H.D.1. 23 juillet 2021 à 12:26:51

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 juillet 2021 à 19:33:03

                                        MaxMlr a écrit:

                                        Mais il n'y a vraiment aucun moyen de récupérer le nom sans passer par un nom avec incrémentation ?

                                        Et si ça existait quels problèmes ça va (vous) aider à résoudre?

                                        Programmer, c'est juste trouver des solutions avec les possibilités qu'offre un langage. Si une fonctionnalité n'existe pas, est ce que c'est parce que le langage est mal foutu (et on devrait trouver des langages qui permettent de...), soit parce que la philosophie de Python fait qu'on peut faire aussi bien autrement sinon mieux. Et on retombe sur la question initiale: quel problème voulez vous résoudre?

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          24 juillet 2021 à 16:01:38

                                          On peut tout faire en Python, même des choses moches et inutiles :lol:

                                          class A:
                                          
                                              def get_name(self):
                                                  return [k for k, v in globals().items() if isinstance(eval(k), type(self))]
                                          
                                          a = A()
                                          print(a.get_name()) # ['a']
                                          
                                          b = A()
                                          print(b.get_name()) # ['a', 'b']
                                          



                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                            25 juillet 2021 à 14:36:19

                                            fred1599 a écrit:

                                            On peut tout faire en Python, même des choses moches et inutiles :lol:

                                            class A:
                                            
                                                def get_name(self):
                                                    return [k for k, v in globals().items() if isinstance(eval(k), type(self))]
                                            
                                            a = A()
                                            print(a.get_name()) # ['a']
                                            
                                            b = A()
                                            print(b.get_name()) # ['a', 'b']
                                            


                                            Ça fonctionne mais je ne comprend pas le fonctionnement



                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              25 juillet 2021 à 14:44:28

                                              MaxMlr a écrit:


                                              Ça fonctionne mais je ne comprend pas le fonctionnement

                                              globals() est le dictionnaire qui contient les variables globales du module, çà trouve les clefs associées à une instance de... et plein de problèmes comme:

                                              a = A()
                                              print(a.get_name()) # ['a']
                                               
                                              b = a
                                              print(b.get_name()) # ['a', 'b']

                                              ou:

                                              def f():
                                                  x = A()
                                                  return x
                                              
                                              a = f()
                                              print(a.get_name()) # ['a']
                                               
                                              b = A()
                                              print(b.get_name()) # ['a', 'b']




                                              -
                                              Edité par mps 25 juillet 2021 à 15:43:26

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                25 juillet 2021 à 19:06:28

                                                MaxMlr a écrit:

                                                fred1599 a écrit:

                                                On peut tout faire en Python, même des choses moches et inutiles :lol:

                                                class A:
                                                
                                                    def get_name(self):
                                                        return [k for k, v in globals().items() if isinstance(eval(k), type(self))]
                                                
                                                a = A()
                                                print(a.get_name()) # ['a']
                                                
                                                b = A()
                                                print(b.get_name()) # ['a', 'b']
                                                


                                                Ça fonctionne mais je ne comprend pas le fonctionnement

                                                Eh bien tant mieux, c'est juste une curiosité justement pour ceux qui savent que ce n'est pas une bonne pratique. Mon but ici est de démontrer que tout est faisable, même ce qui n'est pas conceptuellement correct de faire. De ton côté si tu veux en savoir plus, tu peux regarder la documentation sur 

                                                • globals
                                                • eval
                                                • dictionnaires (dict)
                                                • listes (list)
                                                • type
                                                • isinstance

                                                Aussi tu peux faire un petit test sur chaque fonctionnalité avec ton intepréteur python (sans IDE ! Seulement l'interpréteur en espérant que tu vois la distinction).

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                  25 juillet 2021 à 23:22:05

                                                  fred1599 a écrit:

                                                  Mon but ici est de démontrer que tout est faisable, même ce qui n'est pas conceptuellement correct de faire.

                                                  Conceptuellement c'est une intention pour essayer de résoudre un problème, ce qui fait cruellement défaut ici.

                                                  On ne sait pas quel problème on cherche à résoudre sinon trouver une fonctionnalité magique dont on ne sait trop à quoi elle pourrait servir... Après on peut toujours bricoler un truc pour montrer que face à un problème, on peut toujours bricoler quelque chose - ce qui est un peu le but de la programmation - qui fonctionnera avec plus ou moins de limites.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    28 juillet 2021 à 21:58:35

                                                    Merci pour l’explication
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Récupérer le nom d'objet de classe à son initi.

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown