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 :

un fichier par classe [Fait]


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut un fichier par classe
    Bonjour,

    Voilà j'ai fait un prog qui comporte une 10ene de classe.
    Pour l'instant j'ai tout dans un fichier....

    j'ai donc voulu diviser en plusieurs fichiers... cependant un probleme se pose :


    voilà j'ai une classe qui fait office de singleton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    from Fenetre import *
     
    class Partie:
        _Partie = None
     
        @staticmethod
        def getPartie():
            if Partie._Partie == None:
                Partie._Partie = Partie()
     
            return Partie._Partie
     
     
        def setFenetre(self, f):
            self._fenetre = f
     
        def initialiser(self):
            .....
            self._fenetre.afficher(para)
     
     
    if __name__ == "__main__":
        f = Fenetre()
        Partie.getPartie().setFenetre(f)
        f.autremethode()
    puis j'ai une classe fenetre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    from Partie import *
     
    class Fenetre:
        def afficher(self, para):
            .....
     
        def autremethode(self):
            Partie.getPartie().initialiser()
    voilà mon probleme c'est qui rentre bien dans setFenetre(f) mais quand apres j'appelle f.autremethode(), il appel bien initialiser() de Partie mais il me dit que Partie n'a pas d'attribut _fenetre...., comme si mon singleton n'en etait plus un....alors que si je mets les 2 classes dans un fichier, tout marche parfaitement....

    si qqun a deja eu ce prob ?

    Note : dans l'etat actuel mon exemple peut paraitre sans aucun interet mais c'est sorti de son contexte

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Les attributs de classes commençant par un "_" ne sont accessibles que dans le module (le fichier) où ils sont définis, il en est de même pour les variables, fonctions et classes

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut
    ah.. il ne s'agit pas seulement pour indiquer si la variable est privee(__) ou protected(_) ?

    Mais je n'y accede que dans mon fichier "partie" a la variable _fenetre....donc ca devrai quand meme marcher, non?


  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    C'est normal, tu as une importation circulaire. Donc c'est pas bon.

    En gros l'interpréteur Python fait ceci:

    - lecture du fichier Partie
    - il voit un import fenetre
    - lecture du fichier fenetre (sans finir de lire le fichier Partie)
    - il voit un import Partie (mais comme le lecture du fichier Partie a été lancée donc il ne la relance pas)
    - il tombe sur un truc qui demande Partie (mais comme il n'a pas été chargée en entier, pour lui c'est quelquechose d'inconnu)

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut
    euh non, attention, il lance bien mon Partie.getPartie().initialiser() (si je met un print"dedans" ca affiche bien "dedans", c'est juste que c'est comme si mon
    Partie.getPartie().setFenetre(f) ne s'etait jamais fait ou qu'il m'a refait une instance de Partie..

    car c'est dans le inialiser qu'il me dit : partie n'a pas d'attribut _fenetre qui normalement s'initialiser avec setFenetre(f)

  6. #6
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    il faut declarer _fenetre dans le constructeur.

    Peut etre tu devra essayer ca
    class Partie:
    _Partie = None
    def __init__(self):
    self._fenetre=None

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut
    peut etre mais pour moi j'ai l'impression que quand on import un fichier il crée une copie de ce fichier, et donc mon singleton n'en ai plus un.. c'est surtout ca mon prob c'est qu'il utlise une autre instance de Partie.... d'où l'erreur.. mais je n'arrive pas à la corriger!!!

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut
    Alors la je comprends plus......

    j'ai essayé de mettre :

    puis d'utiliser self.__fenetre

    Et là ca marche !!!!!!

    mais si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def setFenetre():
     
       self.__fenetre = Fenetre()
       self.__fenetre.autremethode()
    là j'ai l'erreur (quand j'appelle inialiser à partir de fenetre) : Partie n'a pas d'attribut : _Partie__fenetre ...

    je comprends pas...

  9. #9
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Si je créé un 3ème fichier et je vire le if __name__ == "__main__": ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from Fenetre import *
    from Partie import *
    f = Fenetre()
    Partie.getPartie().setFenetre(f)
    f.autremethode()
    cela fonctionne
    et si j'inverse les import
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from Partie import *
    from Fenetre import *
    f = Fenetre()
    Partie.getPartie().setFenetre(f)
    f.autremethode()
    ca plante.

    L'importation circulaire peut en être la cause.

  10. #10
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut
    ah... mais le probleme c'est que je ne vois pas comment eviter l'importation circulaire, car etant un singleton, partie est utilisé dans tout mon prog...
    C'est lui qui initialise et gere ma partie....

  11. #11
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Effectivement il y a un probleme de l'importation circulaire. Pour eviter ça une solution est envisageable. On peut placer import juste avant la ligne où nous l'avons besoin et non pas en tete du fichier

    Dans l'exemple donné, on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if __name__ == "__main__":
    from Fenetre import *
        f = Fenetre()
        Partie.getPartie().setFenetre(f)
        f.autremethode()

  12. #12
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut
    merci de votre aide

    cette methode marche avec ma 1ere solution, cependant ma 2eme ecriture de la fonction (declarer fenetre dans la fonction) ne marche pas...

    => FAQ : http://python.developpez.com/faq/?pa...tionCirculaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/01/2013, 19h22
  2. Réponses: 17
    Dernier message: 15/05/2007, 18h35
  3. Peut on manipuler le système de fichier par T-SQL?
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2003, 09h19
  4. Réponses: 1
    Dernier message: 19/08/2003, 16h11
  5. Supprimer un fichier par rapport a une date
    Par NewB dans le forum Linux
    Réponses: 2
    Dernier message: 25/06/2003, 13h44

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