Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreurs d'importation

Débutant en apprentissage

Sujet résolu
    15 février 2011 à 17:21:59

    Bonjour à tous,

    je suis présentement en train d'apprendre Python grâce au tutoriel du site, et je me trouve face à un problème que je trouve un peu absurde.

    En premier lieu, j'utilise Python 3.1 . Je développe sous Eclipse.

    Je crée un fichier de classe que je nomme Personne (le fichier est Personne.py, la classe est Personne, et le constructeur est __init__).

    Lorsque je veux créer un objet personne, j'écris ce code:

    import Personne
    
    maPersonne = Personne()
    


    Mais j'obtiens une erreur. Par contre, ça fonctionne si j'utilise ce code:

    from Personne import *
    
    maPersonne = Personne()
    


    Je ne vois absolument pas pourquoi ça ne veut pas fonctionner (je programme aussi le PHP et l'AS3 en POO, c'est pourtant la syntaxe utilisée). Et fait encore plus troublant, quand j'essaie d'importer la classe Math, Eclipse me dit qu'elle existe pas ! Même avec la syntaxe from Math import *.

    Merci d'avance pour ceux qui sauront ou tenterons de m'aider =)

    PS: Quelqu'un saurait me dire pourquoi les point-virgules ";" ne sont pas utilisés dans ce langage ? Merci
    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2011 à 17:29:26

      quand tu fais "import Personne", tu va importer un module Personne qui contiendra en attribut le contenu de Personne.py, tandis que "from Personne import *" rajoutera tous les attributs de Personne.py dans le scope courant.

      Et je crois que tu parles du module math, et non pas de la classe Math (Python est case-sensitive).
      Ne confond pas classe et module.
      • Partager sur Facebook
      • Partager sur Twitter
      yjltg.
        15 février 2011 à 18:03:12

        Bon premièrement, merci beaucoup pour math (habituellement j'utilise une majuscule). D'ailleurs, je cherchais la méthode random... en fait c'est randrange dans le module random -___-'

        Mais je ne comprends toujours pas pourquoi je ne peux pas simplement importer Personne. Pourtant en AS3, quand j'importe de la façon "import Classe", je peux créer des objets à partir de cette classe. Si quelqu'un est capable d'expliquer pourquoi je ne peux pas avec Python, ce serait apprécié, sinon j'irai chercher de la documentation.

        Merci
        • Partager sur Facebook
        • Partager sur Twitter
          15 février 2011 à 18:12:12

          Parce que tu n'importes pas des classes, mais tu importes des modules.
          Quand tu fais "import Module", c'est comme si tu faisais un "#include <Module.h>" en C par exemple, sauf que les objets contenus dans Module seront ensuite accessible comme attributs de l'objet Module.
          • Partager sur Facebook
          • Partager sur Twitter
          yjltg.
            15 février 2011 à 18:12:18

            Citation : AntoLeNice

            Bon premièrement, merci beaucoup pour math (habituellement j'utilise une majuscule). D'ailleurs, je cherchais la méthode random... en fait c'est randrange dans le module random -___-'

            Mais je ne comprends toujours pas pourquoi je ne peux pas simplement importer Personne. Pourtant en AS3, quand j'importe de la façon "import Classe", je peux créer des objets à partir de cette classe. Si quelqu'un est capable d'expliquer pourquoi je ne peux pas avec Python, ce serait apprécié, sinon j'irai chercher de la documentation.

            Merci


            import Personne
            maPersonne = Personne.Personne()
            
            • Partager sur Facebook
            • Partager sur Twitter
              15 février 2011 à 18:17:11

              AHHHH et bien merci beaucoup à vous 2. FMIS@Menace. ton exemple a vite fait de me faire comprendre. En fait il suffit que je fasse from Personne import Personne, pour importer ma classe qui est dans mon module. Du moins c'est ce que j'en comprends, et ça fonctionne. Merci beaucoup alors !
              • Partager sur Facebook
              • Partager sur Twitter
                15 février 2011 à 18:22:13

                # test.py
                from foo import Bar
                
                maReponse = Bar()
                print(maReponse.reponse)
                


                # foo.py
                class Bar:
                    def __init__(self):
                        self.reponse = 42
                


                Et quand tu executes test.py :

                42
                


                Cette exemple simpliste illustre bien la situation.
                o Quand tu écris from foo import Bar, tu demandes à python : "donne moi "directement" la classe Bar du module foo"
                o Par contre, quand tu écris : "import foo", tu lui demandes "je souhaite acceder "indirectement" au module foo".
                -> Ainsi, si tu utilise la seconde syntaxe, tu dois spécifier d'où tu prend ton module Bar, comme ceci :

                # test.py
                import foo
                
                maReponse = foo.Bar() # Tu dois spécifier d'où viens ta classe
                print(maReponse.reponse)
                


                # foo.py - on ne change rien au script
                class Bar:
                    def __init__(self):
                        self.reponse = 42
                


                Et quand tu executes test.py :

                42
                


                J'espère avoir su t'aider...

                EDIT : Grilled par FMIS@Menace :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  16 février 2011 à 4:03:46

                  Merci quand même Yohan, j'ai pu comprendre grâce au code de FMIS@Menace, mais n'importe qui ne comprendrais pas. Si quelqu'un se retrouve avec la même incompréhension, ton explication est mieux détaillée =)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Erreurs d'importation

                  × 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