Partage
  • Partager sur Facebook
  • Partager sur Twitter

Classes, méthodes, paramètres

    31 juillet 2019 à 12:33:57

    Bonjour (re),

    J'ai une erreur que je ne comprends pas. Faut dire je ne suis pas très à l'aise avec les méthodes d'une classe qu'on importe dans une autre.

    J'ai un module (extrait) : 

    class CreationLabyrinthe(object) :
        (...)
        def chargement(self,chemin,nom_fichier,joueurs_sockets) :
            """Récupère la carte choisie par l'utilisateur, et la transfère dans
    une liste des lignes de la carte"""
            
            with open(chemin +'/'+ nom_fichier,'r') as fichier :
                self.labyrinthe = []
                while 1 :
                    ligne = fichier.readline()
                    if ligne == '' :
                        break
                    else :
                        ligne = list(ligne)                                 
                    self.labyrinthe.append(ligne)
                    
            # j'ajoute le robot :
            self.robot(joueurs_sockets)

    Ensuite, dans ma classe principale, j'ai besoin de la méthode chargement donc. 

    j'ai donc ça : 

    class Carte(object):
        """Blablabla"""
    (...)
        def lancement(self,joueurs_sockets,connectes) :
            """ Lancement du jeu 'Roboc', composé principalement du choix
    de la carte"""
    
            self.joueurs = joueurs_sockets
             
            for cartes in self.liste_cartes :
                env = cartes.encode() + b"\n"
                connectes.send(env)
                    
            connectes.send(b"L'un de vous doit choisir : \n")
            connectes.send(b"Tapez 0 pour une carte aleatoire\n")
            connectes.send(b"Ou son numero pour choisir l'une des cartes ci-dessus\n")
    
            choix = connectes.recv(5).decode()
    
            while choix != int(choix) :
                try :
                    choix = int(choix)
                except ValueError:
                    connectes.send(b"Choix invalide. Tapez 0 ou un numero : ")
                    choix = connectes.recv(5).decode()
    
                    
            while not (0 <= choix <= self.maxi) :
                connectes.send(b"Choix invalide. Tapez 0 ou un numero : ")
                choix = connectes.recv(5).decode()
    
            (blabla)
            elif choix > 0 and choix <= self.maxi : 
                self.nom = self.liste_cartes[choix-1]
                connectes.send(self.nom.encode())
                CreationLabyrinthe.chargement(self.path,self.nom,joueurs_sockets)
                self.envoi_carte()
                connectes.send(self.carte)
                print(self)
            

    mon problème est ligne 36

    CreationLabyrinthe(self.path,self.nom,joueurs_sockets) : j'ai bien 3 paramètre

    Comme dans la méthode du module. 

    Mais Python me dit qu'il manque 1 required positional argument

    Pourquoi ?

    Qu'est-ce que je ne fait pas bien ?


    -
    Edité par Thia 31 juillet 2019 à 12:36:52

    • Partager sur Facebook
    • Partager sur Twitter
      31 juillet 2019 à 12:53:24

      Je comprend pas pourquoi tes classes héritent de object ...

      Et ensuite pourquoi tu fais CeationLabyrinthe.chargement() la tu appelle la classe et lui demande de lancer la méthode mais tu n'as pas fais d'objet avant avec ta classe et pourtant tu n'utilise pas de méthode de classe donc il doit attendre que tu lui fournisse self puisque tu n'as pas fais d'instance avec ta classe

      • Partager sur Facebook
      • Partager sur Twitter
        31 juillet 2019 à 13:49:28

        Oui il manque bien un argument : self
        • Partager sur Facebook
        • Partager sur Twitter
          31 juillet 2019 à 14:36:41

          Ah mais oui c'est ça :D

          Coliculus a écrit:

          Je comprend pas pourquoi tes classes héritent de object ...

          (...)

          J'ai pas relu mon Swinnen avant de répondre donc....j'ai peut-être mal compris. Mais il me semble bien que TOUTES les classes héritent d'object. Quand tu créé une classe sans rien

          class Bidule():
          """blablabla"""

          elle ne se créé pas par l'opération du Saint Esprit, en réalité elle hérite d'object, même si t'es pas obligé de le noter entre les (). Après, moi je viens de l'école Swinnen, et je pense qu'il a raison de le mettre systématiquement, ça permet justement de ne pas oublier d'où elle vient ta classe.

          Bon, pour revenir à mes bouts de code, j'ai encore une erreur :-°

          ligne 18 de mon 1er extrait de code, j'ajoute le robot sur un emplacement aléatoire de ma carte.

          Donc mon self.robot, c'est une méthode qui s'exécute à ce moment-là. Mais évidemment, à l'import, Python n'est pas d'accord, il me dit que mon objet " has no attribute 'robot' "

          Ou alors il faut que je le fasse en 2 fois ?

          C'est à dire au lieu d'exécuter une méthode dans une autre, puis d'importer la 2ème méthode, il faudrait que je les importe une par une ?

          oulà...j'espère que vous avez compris ce que j'essaie de raconter :euh:

          Edit : YESSSS ! c'était ça ! il faut les exécuter 1 par 1 !

          Merci 



          -
          Edité par Thia 31 juillet 2019 à 14:42:58

          • Partager sur Facebook
          • Partager sur Twitter
            31 juillet 2019 à 15:46:38

            Mouais, écrire object était obligatoire en python2. En python3 pylint le signale si on le met.

            En principe on écrit ça :

            class Bidule:
                pass



            • Partager sur Facebook
            • Partager sur Twitter
              31 juillet 2019 à 22:19:58

              thelinekioubeur a écrit:

              Mouais, écrire object était obligatoire en python2. En python3 pylint le signale si on le met.

              Pour avoir fait plus de python2 que 3 jusqu'a présent je me permet de te contredire, même en python2 c'est pas obligatoire du tout ;)

              En fait oui elles héritent d'object par défaut ce que je voulais dire c'est pourquoi l'ecrire puisqu'elle le font déjà ?

              Thia a écrit:

              Donc mon self.robot, c'est une méthode qui s'exécute à ce moment-là. Mais évidemment, à l'import, Python n'est pas d'accord, il me dit que mon objet " has no attribute 'robot' "

              Ou alors il faut que je le fasse en 2 fois ?

              C'est à dire au lieu d'exécuter une méthode dans une autre, puis d'importer la 2ème méthode, il faudrait que je les importe une par une ?

              J'ai pas compris qu'est ce que tu importe ? ta classe est dans un autre module et tu importe juste certaines méthodes ?

              cette sythaxe devrait fonctionner sans pb:

              class foo:
                 def secondary_method(self):
                      print("2nd")
                 def main_method(self):
                      self.secondary_method()
                      print('principale')
              
              instance = foo()
              instance.main_method()



              -
              Edité par Coliculus 31 juillet 2019 à 22:28:41

              • Partager sur Facebook
              • Partager sur Twitter
                1 août 2019 à 7:38:46

                Mais en python2 on n'obtient pas la même chose si on met object ou pas.

                >>> class Foo:
                ...  pass
                ... 
                >>> class Bar(object):
                ...  pass
                ... 
                >>> type(Foo)
                <type 'classobj'>
                >>> type(Bar)
                <type 'type'>
                >>> dir(Foo)
                ['__doc__', '__module__']
                >>> dir(Bar)
                ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
                



                Alors qu'en python3 on a bien la même chose dans les deux cas.



                -
                Edité par thelinekioubeur 1 août 2019 à 7:39:23

                • Partager sur Facebook
                • Partager sur Twitter
                  1 août 2019 à 9:51:56

                  Thia a écrit:

                  Ensuite, dans ma classe principale, j'ai besoin de la méthode chargement donc. 

                  Vous avez besoin d'appeler la méthode chargement d'une instance de CreationLabyrinthe

                  Ca se fait en 2 temps: création de l'instance, appel de la méthode associée:

                      self.labyrinthe = CreationLabyrinthe(...)
                      self.labyrinthe.chargement(self.path, self.nom, joueurs_sockets)

                  ou avec un appel de fonction:

                      self.labyrinthe = CreationLabyrinthe(...)
                      CreationLabyrinthe.chargement(self.labyrinthe, self.path, self.nom, joueurs_sockets)

                  -
                  Edité par mps 1 août 2019 à 10:41:18

                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 août 2019 à 9:53:15

                    Parce qu'il passe implicitement par object je pense pour certaines choses:

                    class Foo:
                        pass
                    
                    print(Foo.__dict__) # ca fonctionne même si pas dans dir(Foo)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 août 2019 à 14:51:01

                      Oui en effet, au lieu d'exécuter une méthode dans une autre méthode, avant d'essayer d'importer seulement la dernière méthode (lol.....bravo à ceux qui suivent^^) j'ai séparé tout ça de manière à ce que ça s'exécute de manière indépendante, et donc,dans mon programme principal, je dois exécuter 2 méthodes successivement (au lieu d'une).

                      elif choix > 0 and choix <= self.maxi : 
                                  self.nom = self.liste_cartes[choix-1]
                                  connectes.send(self.nom.encode())
                                  CreationLabyrinthe.chargement(self,self.path,self.nom)
                                  CreationLabyrinthe.robot(self,joueurs_sockets)
                                  self.envoi_carte()
                                  connectes.send(self.carte)
                                  print(self)

                      maintenant dans mon programme principal (si on peut dire...bref) j'ai CreationLabyrinthe.chargement(), et ensuite CreationLabyrinthe.robot().

                      Avant, robot() était imbriqué dans chargement dans le module CreationLabyrinthe, ça fonctionnait pas.

                      Note pour moi-même : faut arrêter d'imbriquer des trucs dans d'autres trucs. Parce qu'il y a un moment où c'est ingérable :lol:

                      Merci pour votre aide :)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 août 2019 à 16:37:40

                        Thia a écrit:

                        dans mon programme principal, je dois exécuter 2 méthodes successivement (au lieu d'une)

                        CreationLabyrinthe.chargement n'est pas une méthode mais une fonction et le self passé à cette fonction doit être une instance de CreationLabyrinthe. Car si Python tolère beaucoup de choses en supposant que vous savez ce que vous faites, dans le cas contraire, çà va râler plus tard.

                        note: on importe des modules pas des classes.

                        -
                        Edité par mps 1 août 2019 à 18:38:35

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Classes, méthodes, paramètres

                        × 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