Partage
  • Partager sur Facebook
  • Partager sur Twitter

Instancier une classe dans un autre fichier

    4 avril 2022 à 19:39:06

    Bonjour,

    Je commence à travailler la programmation orientée objet en Python, et je bute sur un élément fondamental qui est l'instanciation de ma classe. Il me semble qu'en java, on crée un fichier par classe, et pour instancier une classe il faut même créer une nouvelle classe, donc un nouveau fichier, appelée main. Peut-être n'est-ce en fait pas obligatoire, mais il me semble que cela devient nécessaire quand on commence à travailler sur des projets volumineux. Il m'a donc semblé naturel de retrouver cette façon de faire en python. Et c'est là que j'ai entendu éclater un rire diabolique chaque fois que j'ai voulu exécuter mon fichier d'instanciation qui importe ma classe.

    J'ai une classe appelée NewRandomForestModel dans le fichier newrandomforestmodel.py (est-ce bien la typographie recommandée ?). Ce fichier est dans mon dossier personnel Documents/.../Projet.

    Je crée un nouveau fichier dans le même dossier, par exemple test.py, pour y instancier ma classe. Dans test.py, je fais donc :

    from newrandomforestmodel import NewRandomForestModel

    On se doute bien comme c'est que le début de l'histoire que ça donne une erreur :

    ModuleNotFoundError: No module named 'newrandomforestmodel'


    J'ai essayé les orthographes de différentes versions Python, avec ou sans point, ou encore en créant un fichier __init__.py qui contient la ligne :

    from . import newrandomforestmodel

    Rien n'y a fait. Après quelques recherches (en fait 2h infructueuses), je tombe sous le choc lorsque j'apprends que l'importation de modules locaux est un pan à part entière de Python, qui nécessite d'abord d'obtenir quelques ceintures pour y avoir recours dans le cadre d'un projet propre et distribuable.

    J'ai donc laissé pour l'instant de côté l'idée d'apprendre à faire des packages, et j'ai essayé d'ajouter le chemin de mon fichier test dans la liste des chemins que python va suivre lorsque je lui demanderai d'importer quelque chose :

    import sys
    from pathlib import Path
    
    lib_path = Path(__file__).parent / "Projet"
    lib_path = lib_path.resolve()
    sys.path.insert(0, str(lib_path))

    Et là ... une autre erreur prend le relai :

    NameError: name '__file__' is not defined

    Je suis à présent à court d'idées. Est-ce que le code ci-dessus est faux ? Dois-je apprendre à faire des packages ?

    Je vous serais infiniment reconnaissante si vous pouviez m'aider à réaliser cette tâche qui n'est en fin de compte pas si simple.

    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2022 à 21:32:41

      Bonsoir , 

      Je pense que pour l'erreur qui se produit en essayant d'importer ta classe c'est du au répertoire de travail courant.

      Pour répondre à ta question c'est évidemment très facile d'intancier une classe dans un autre fichier vue que tu va importer la classe il faut juste le faire dans le répertoire de travail courant ou changer le répertoire de travail avant l'importation  exemple :

      import os 
      print(os.getcwd())#Le répertoire courant
      
      #pour changer le répertoire
      os.chdir("")
      #tu mets le chemin du module entre les guillemets

      A bientôt j'espère que j'ai résolu ton problème .

      -
      Edité par HTGamer 4 avril 2022 à 21:33:28

      • Partager sur Facebook
      • Partager sur Twitter
        5 avril 2022 à 1:50:23

        Le nom que tu donnes dans
        from blabla import chose
        Python va chercher le fichier blabla.py dans le répertoire courant.
        Tu peux avoir une fonction, variable ou classe du même nom dans ce fichier,
        Attention, je me suis déjà fait jouer un tour.
        Il existe un fichier copy.py dans la bibliothèque standard de Python.
        J'avais créé un fichier copy.py dans mon répertoire courant. C'est le mien quePython a pris en premier.
        C'est la règle. Il faut donc éviter d'appeler des fichiers du même nom que ceux de la bibliothèque standard.
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          5 avril 2022 à 10:08:54

          __file__ n'est valable que dans un fichier, dans l'interpréteur python, cette erreur est normale car il ne peut pas donner de nom de fichier puisque le code est saisi dans l'interpréteur.
          • Partager sur Facebook
          • Partager sur Twitter

          Instancier une classe dans un autre fichier

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown