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 :

Découpage en plusieurs classes..?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut Découpage en plusieurs classes..?
    Bonjour à tous,

    Mon souci je crois est que je n'ai pas encore bien assimilé le modèle objet, j'ai mon programme en python qui marche à peu près le problème c'est que j'aimerai séparer ce qui est graphique de mes fonctions :

    exemple de mon programme mal structuré :
    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
    class MeP_Form(QDialog):
        "Interface du plugin MeP"
        def __init__(self, iface):
     
            #Une fenetre Dialogue
            QDialog.__init__(self)
            self.iface=iface
            self.setFixedSize(800, 600)
            self.setWindowTitle("Mise en Page Automatique")
     
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            cb_orientation= QComboBox()
            cb_orientation.addItem("Paysage")
            ...
     
            def lbl_Redimension(strPortrait):
     
                if strPortrait == "Portrait":
                    label_ApercuImage.setFixedSize(315, 445)
                else:
                    label_ApercuImage.setFixedSize(445, 315)
                changement_thematique(cb_thematique.currentText())
                pb_Validemodele.setText(str(function.crado))
                resume_Info()
           ...
    Pour l'instant j'arrive à avoir deux modules avec une classe chacun, le problème c'est que je n'arrive pas à agir sur "cb_orientation" par exemple enfin tous les éléments graphiques que j'ai mis dans la classe MeP :

    ma deuxieme classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MeP_Function(object):
        """Methodes simple liees a l'interface"""
        def __init__(self):
            self.attribut1 = "attribut1 ok"
        def base (self):
            return self.attribut1+"Yopiyo"
            #Ici j'aimerai appelle cb_orientation en faisant
            #MeP_Form.cb_orientation.methodx()
    Une erreur survient et me signale que MeP_Form n'a pas d'attribut cb_orientation comment puis-je faire ? Ai-je oublié quelque-chose ? Qu'est-ce que je n'ai pas encore saisi ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benbannock Voir le message
    Bonjour à tous,

    Mon souci je crois est que je n'ai pas encore bien assimilé le modèle objet, j'ai mon programme en python qui marche à peu près le problème c'est que j'aimerai séparer ce qui est graphique de mes fonctions :

    exemple de mon programme mal structuré :
    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
    class MeP_Form(QDialog):
        "Interface du plugin MeP"
        def __init__(self, iface):
     
            #Une fenetre Dialogue
            QDialog.__init__(self)
            self.iface=iface
            self.setFixedSize(800, 600)
            self.setWindowTitle("Mise en Page Automatique")
     
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            cb_orientation= QComboBox()
            cb_orientation.addItem("Paysage")
            ...
     
            def lbl_Redimension(strPortrait):
     
                if strPortrait == "Portrait":
                    label_ApercuImage.setFixedSize(315, 445)
                else:
                    label_ApercuImage.setFixedSize(445, 315)
                changement_thematique(cb_thematique.currentText())
                pb_Validemodele.setText(str(function.crado))
                resume_Info()
           ...
    Pour l'instant j'arrive à avoir deux modules avec une classe chacun, le problème c'est que je n'arrive pas à agir sur "cb_orientation" par exemple enfin tous les éléments graphiques que j'ai mis dans la classe MeP :

    ma deuxieme classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MeP_Function(object):
        """Methodes simple liees a l'interface"""
        def __init__(self):
            self.attribut1 = "attribut1 ok"
        def base (self):
            return self.attribut1+"Yopiyo"
            #Ici j'aimerai appelle cb_orientation en faisant
            #MeP_Form.cb_orientation.methodx()
    Une erreur survient et me signale que MeP_Form n'a pas d'attribut cb_orientation comment puis-je faire ? Ai-je oublié quelque-chose ? Qu'est-ce que je n'ai pas encore saisi ?
    Exact. La classe, c'est à dire le modèle "MeP_Form" n'a pas d'atribut cb_orientation.
    C'est la variable de type "Mep_Form" qui a cet attribut !!!
    Exemple: a=Mep_Form()
    a.cb_orientation() => ça ça marche

    Faut essayer de voir l'objet à travers un exemple. Imaginons l'objet "voiture". Une voiture possède des éléments généraux et abstraits comme le nb de roues, la couleur, la vitesse, etc. Mais tant que tu ne parles pas d'une voiture précise, ces éléments restent abstraits et n'ont aucune réalité. Tu peux pas demander "voiture.vitesse()" car personne ne sait de quelle voiture tu parles. Te faudra d'abord créer la variable "X" de type "voiture" puis affecter à cette variable "X" sa vitesse, sa couleur, etc...

    Ensuite quand tu seras plus à l'aise, on pourra parler de méthodes et membres statiques qui peuvent s'utiliser avec une classe sans avoir de variable associée à cette classe mais ce sera pour après...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Salut,

    Pour l'instant j'arrive à avoir deux modules avec une classe chacun
    Veux-tu dire que la classe MeP_Form(QDialog) se trouve dans un module1.py
    et que la classe MeP_Function(object) se trouve dans un module2.py
    et que tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import module1
    import module2
    pour disposer de
    module1.MeP_Form
    et module2.MeP_Function
    dans ton programme ?





    Si cb_orientation= QComboBox() est une fonction dont les valeurs retournées sont indépendantes de toute instance de MeP_Form(QDialog) ,
    je pense que tu peux en faire un attribut de la classe MeP_Form(QDialog) :


    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
    class MeP_Form(QDialog):
        "Interface du plugin MeP"
     
        cb_orientation= QComboBox()
        cb_orientation.addItem("Paysage")
     
        def __init__(self, iface):
     
            #Une fenetre Dialogue
            QDialog.__init__(self)
            self.iface=iface
            self.setFixedSize(800, 600)
            self.setWindowTitle("Mise en Page Automatique")
     
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            ...

    Dès lors, l’appel MeP_Form.cb_orientation.methodx() devrait marcher.
    Devrait, si j'ai bien compris le problème et si je ne me trompe pas....

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut
    Ok je crois comprendre, alors j'ai passé mon instance de classe en paramètre pour le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MeP_Function(object):
        """Methodes simple liees a l'interface"""
        def __init__(self,truc):
            self.attribut1 = "attribut1 ok"
            self.objetMeP_Form = truc
     
        def base (self):
            self.objetMeP_Form.pb_Validemodele.setText("ma fonction est bonne")
            return self.attribut1+"Yopiyo"
            #pb_Validemodele est un Push button déclaré dans MeP_Form


    Veux-tu dire que la classe MeP_Form(QDialog) se trouve dans un module1.py
    et que la classe MeP_Function(object) se trouve dans un module2.py
    et que tu fais
    Code :

    import module1
    import module2

    pour disposer de
    module1.MeP_Form
    et module2.MeP_Function
    dans ton programme ?
    C'est exactement ca !

    Peut-être que le fait d'avoir mis mes éléments graphiques dans le "constructeur" __init__ de MeP_Form est problématique, je les ai déplacé et mis comme ton code le montre entre la déclaration de classe et la méthode __init__ et ca marche !!!

    Par contre je ne comprends pas pourquoi ??

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 21
    Par défaut
    J'ai posté trop vite, je n'ai plus de message d'erreur mais j'ai l'impression que la méthode suivante :
    self.objetMeP_Form.pb_Validemodele.setText("ma fonction est bonne")

    ne s'execute pas enfin du moins le texte ne change pas alors que lorsque je fais directement dans ma classe
    pb_Validemodele.setText("texte blabla")

    ca marche là je suis interloqué....

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Peut-être que le fait d'avoir mis mes éléments graphiques dans le "constructeur" __init__ de MeP_Form est problématique
    Ça dépend ce qu’on entend par problématique.

    Par contre je ne comprends pas pourquoi ??
    C’est une bonne remarque, il faut comprendre les erreurs si on ne veut pas faire de la bidouille.

    La présence d’instructions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            bg_1=QButtonGroup()
            rb_A4 = QRadioButton("A4")
            cb_orientation= QComboBox()
            cb_orientation.addItem("Paysage")
    dans la fonction __init__() (j’hésite à l’appeler constructeur, il y a un débat là dessus)
    crée simplement des objets bg_1, rb_A4, cb_orientation en tant qu’objets locaux, c’est à dire des objets dont les identifiants apparaissent dans l’espace de noms local à la fonction __init__() .

    Cette dernière a un rôle particulier, mais ce n’est après tout qu’une fonction qui n’est en elle même pas particulière. Aussi quand on lui dit de créer des objets locaux, elle le fait , et quand l’exécution de la fonction __init__() est terminée, son espace de noms disparaît et donc les objets bg_1, rb_A4, cb_orientation n’existent ensuite plus.
    À ce niveau , il n’y a pas d’erreur, l’exécution n’est pas problématique.
    Illustration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A:
        def __init__(cap,nom):
            cap.name = nom
            n = 190
            ch = 'je suis une chaine locale'        
            print '\n'.join(repr(u) for u in locals().iteritems())
     
    x = 'je suis une chaine globale'
    a = A('soleil')
    print a.__init__.ch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ('nom', 'soleil')
    ('cap', <__main__.A instance at 0x010BA990>)
    ('ch', 'je suis une chaine locale')
    ('n', 190)
    
    Traceback (most recent call last):
      File "E:\Python\python27 12juillet10\essaii44.py", line 10, in <module>
        print a.__init__.ch
    AttributeError: 'function' object has no attribute 'ch' 
    Là où ça devient problématique, c’est quand tu cherches à utiliser l’un de ces objets disparus. Mais c’est un problème d’algorithme, pas du code en lui même.









    je les ai déplacé et mis comme ton code le montre entre la déclaration de classe et la méthode __init__ et ca marche !!!
    J'ai posté trop vite, je n'ai plus de message d'erreur
    Je pense que le « ça marche » signifiait que tu n’avais plus de message d’erreur.

    Soit dit en passant, il est hautement intéressant pour ceux qui essaient d’apporter des solutions de voir les messages d’erreurs pour mieux analyser ce qui se passe.
    Il faut donc poster les messages d’erreur.






    alors j'ai passé mon instance de classe en paramètre pour le constructeur
    Ce qu’on passe n’est pas un paramètre, c’est un argument.

    Un paramètre est seulement un symbole présent à au moins deux endroits dans un code, destiné à symboliser où va se retrouver utilisé dans le code un argument qui sera passé à la première position du paramètre. Ce n’est pas l’identifiant d’un objet comme l’est un argument.







    Pour que
    self.objetMeP_Form.pb_Validemodele.setText("ma fonction est bonne")
    s’exécute, il faut qu’elle soit appelée.

    Telle qu’elle est placée dans le code ci-dessus, il faut pour cela que MeP_Function.base() soit elle même appelée.

    Est-ce le cas ?

    Pourrais tu nous montrer le code concerné, ce serait quand même plus pratique.


    Il faudrait aussi qu’on comprenne où dans le code la fonction pb_Validemodele.setText() est définie.

Discussions similaires

  1. [MFC] objet commun a plusieurs classes
    Par Info42 dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2006, 18h52
  2. Heritage de plusieur classes
    Par JiJiJaco dans le forum Langage
    Réponses: 10
    Dernier message: 26/12/2005, 19h12
  3. [css] plusieurs classes appellées? comment ça marche
    Par luta dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 09/11/2005, 00h20
  4. Utilisation de variables dans plusieurs classes
    Par dedeloux dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2005, 17h25
  5. [Servlet] Utilisation de plusieurs classes
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/05/2005, 09h43

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