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 :

Pb d'accès aux données d'un objet


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Par défaut Pb d'accès aux données d'un objet
    Bonjour,

    J'ai un problème lié à ce code (petit prototype d'un programme de gestion de notes)

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    # ------------------- carnet de notes  --------------------------#
     
     
    import Tkinter
     
    class note:
        "definition d'un objet note comportant 3 données : le coef / le resultat / le trimestre "
        def __init__(self, c =0, r =0, t =1):
            self.coef=c
            self.resultat=r
            self.trimestre=t
     
        def definit(self):
            "fixe les données de la note en cours"
     
            print " Coef ?"
            self.coef= input()
            print " resultat ?"
            self.resultat= input()
            print " Trimestre ?"
            self.trimestre = input()
     
     
     
        def affiche_note(self):
            print str(self.coef) + "," + str(self.resultat) + "," + str(self.trimestre)
     
     
    class serie_note(note):
        "definition d'une série comme liste de notes d'un élève"
     
     
        def __init__(self,ln=[]):
            note.__init__(self,c=0,r=0,t=1)
     
            self.liste_note=ln
     
        def ajoute(self):
     
            self.definit()
            self.liste_note.append(note)
     
        def affiche(self):
            print str(self.coef)
            print self.liste_note.coef #ne fonctionne pas comme prévu
     
     
     
    class eleve(serie_note):
        "definition d'un objet eleve comme une liste de note + un nom "
     
        def __init__(self,n='nobody'):
            serie_note.__init__(self)
     
            self.nom=n
     
     
        def nommer(self):
            print "Nom de l'élève ?"
            self.nom=raw_input()
     
        def affiche_eleve(self):
            print "Voici l'élève et ses notes"
            print str(self.nom)
            #note.affiche_note(self)
            serie_note.affiche(self)
     
    #--------------  Test de la classe *note*  -------------------#
     
    bidule = note()
    bidule.coef=2
    bidule.resultat=14
    bidule.trimestre=2
    bidule.affiche_note()
     
    #--------------------- fin du test classe *note* ----------#
    #--------------------- Test de la classe *Eleve*  et "serie_note"------------#
     
    First=eleve()
    First.nommer()
    #First.coef=2
    #First.resultat=14
    #First.trimestre=2
    First.ajoute()
    First.ajoute()
    First.affiche_eleve()
     
    #------------------- fin du test# classe ------------#


    Dans la classe "serie_note" (qui a comme attribut" une liste contenant des objets notes) je n'arrive pas à imprimer à l'écran la liste contenu dans l'objet (pardon, l'instance de classe) . Comment faire pour accèder au contenu de cette liste. Cela doit êter trivial mais comme je n'ai fait essentiellement que du procédural à part pour les IHM et quelques scripts en POO simples en python jusque là, j'avoue que j'ai du mal sur ce petit bout de code.

    Je peux le faire en procédural bien sûr mais je préférerais passer tout en objets pour ce petit logiciel.

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Salut,
    Citation Envoyé par richard
    l'objet (pardon, l'instance de classe)
    Objet = instance de classe

    Alors le problème est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print self.liste_note.coef #ne fonctionne pas comme prévu
    Cette ligne ne peut fonctionner, puisque self.liste_note est une liste de notes. Il faut donc parcourir cette liste, pour accéder à chaque note.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for note in self.liste_note:
        print note.coef
    Cette boucle affiche le coef de chaque note contenue dans la liste.

    Mais partons du français : serie_note est une liste de notes... Donc cette classe n'a aucune raison d'hériter de la classe note, non ? En gros, tu dis que ta liste de notes est une note

    Il y a aussi un problème avec cette méthode, de la classe serie_note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def ajoute(self):
        self.definit()
        self.liste_note.append(note)
    Tu utilises une variable 'note' qui n'est pas définie... Elle n'est donc pas ajoutée à ta liste. Je le verrai plutot comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def ajoute(self):
        uneNote = note()
        uneNote.definit()
        self.liste_note.append(uneNote)
    Je n'ai pas le temps d'approfondir, mais une dernière chose : tu utilises une variable 'note', et tu as défini une classe 'note'... Tu me suis ? Pour éviter les problèmes, nommes tes classes en partant d'une majuscule, et tes variables avec des minuscules

  3. #3
    Membre chevronné
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Par défaut
    Citation Envoyé par Vladislav IV
    Salut,

    Objet = instance de classe
    Oui, je savais, mais comme j'ai appris la POO avec le pascal Objet, le vocabulaire n'est pas celui de Python


    Citation Envoyé par Vladislav IV
    Alors le problème est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print self.liste_note.coef #ne fonctionne pas comme prévu
    Cette ligne ne peut fonctionner, puisque self.liste_note est une liste de notes. Il faut donc parcourir cette liste, pour accéder à chaque note.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for note in self.liste_note:
        print note.coef
    Cette boucle affiche le coef de chaque note contenue dans la liste.
    OK, mais pourtant si je définis la liste "note" ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    note = []
    note.append(12)
    note.append(15)
    note.append(16)
    je peux ensuite l'afficher en faisant un simple "print note". Ce n'est pas possible avec une liste composée d'objets ? Pourquoi ?


    Citation Envoyé par Vladislav IV
    Mais partons du français : serie_note est une liste de notes... Donc cette classe n'a aucune raison d'hériter de la classe note, non ? En gros, tu dis que ta liste de notes est une note

    Non, je veux dire que serie_note est une liste de notes. mais peut-être la sémantique utilisée n'est-elle pas bonne. Proposition ?
    Ce qui m'intéresse, en fait, c'est de partir d'un objet simple possédant quelques méthodes de base et d'élargir les compétences de cet objet par héritages successifs : note est un objet simple, serie_note hérite des attributs de note mais devient une liste d'objets note qui possède des méthodes liées à la structure de données liste, enfin eleve est un objet qui hérite de serie_note et qui ajoute d'autres attributs.

    Maintenant, du point de vue de la conception tu sembles dire qu'il faudrait que je parte d'un objet serie_note, pourrais-tu approfondir un peu, SVP ?


    Citation Envoyé par Vladislav IV
    Il y a aussi un problème avec cette méthode, de la classe serie_note
    Je n'ai pas le temps d'approfondir, mais une dernière chose : tu utilises une variable 'note', et tu as défini une classe 'note'... Tu me suis ? Pour éviter les problèmes, nommes tes classes en partant d'une majuscule, et tes variables avec des minuscules
    Merci du conseil. C'était confus, en effet.

    Merci pour toutes ces infos ... S'il y a d'autres suggestions ...

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Un objet n'est pas forcément une instance de classe, une classe, le type, est aussi un objet.

  5. #5
    Membre chevronné
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Par défaut
    Citation Envoyé par Miles
    Un objet n'est pas forcément une instance de classe, une classe, le type, est aussi un objet.
    Sans vouloir dévier le sujet initial, en Pascal Objet (mais je ne sais pas dans les autres langages objet) l'objet est une instance de classe, et un Type objet est une classe (abstraite donc). Ce sont les recommandations de Niklaus Wirth. Maintenant ceci ne vaut peut-être que pour le Pascal Objet qui fait la différence entre un Type (= une classe abstraite) qu'on ne peut pas manipuler et qui sert de "patron général" et une variable (l'objet / la classe instanciée) que l'on peut manipuler.

    Probablement différent en Python mais je ne sais comment le dire.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    En Python, tout est un objet.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Citation Envoyé par Miles
    Un objet n'est pas forcément une instance de classe, une classe, le type, est aussi un objet.
    Si, c'est le principe même de la POO : on a des classes, et des objets, qui sont des instances de ces classes. Un objet est toujours l'instance d'une classe.

    Pour le cas du type, c'est un peu tordu, on a effectivement un objet 'type', une fonction 'type', et une classe 'type' (nécessaire, puisque l'on en a une instance).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>>#documentation de la fonction 'type'
    >>> print type.__doc__
    type(object) -> the object''s type
    type(name, bases, dict) -> a new type
    >>>#affichage du nom de la classe à l'origine de l'objet 'type'
    >>> type.__class__.__name__
    'type'
    Edit : au temps pour moi, il n'y a pas de fonction 'type', c'est la classe 'type' qui dispose d'une méthode '__call__'.

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pardon, je me suis mal exprimé.
    Une classe est un type, OK ? Cette classe est elle aussi un objet, qui peut être une instance d'une méta-classe, au besoin.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Pour en revenir au sujet, richard, je pense qu'il y a un problème au niveau de ta conception : tu ne peux pas dire que ta collection de notes est une note. C'est pourtant ce que tu essaies de faire. Tu devrais plutot considérer qu'il y a des notes, et qu'un étudiant possède un ensemble de notes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Note:
        [...]
     
    class Etudiant:
        def __init__(self):
            self.lesNotes = []
     
        def ajouterNote(self, uneNote):
            self.lesNotes.append(uneNote)
    Je pense que ce serai plus simple et plus logique.

  10. #10
    Membre chevronné
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Par défaut
    OK, je devais être distrait ... j'ai compris (l'évidence ! ) pour le "print" : comme les données sont elles-mêmes encapsulées dans un objet et que cet objet est contenu dans une liste, pour accèder au données, il faut accèder aux attributs de l'objet note, bref, il y a deux couches au lieu d'une.

    Pour la conception objet du programme, je reste à l'écoute des suggestions ...

Discussions similaires

  1. [Hibernate]Accès aux données BDD via Hibernate
    Par LESOLEIL dans le forum Hibernate
    Réponses: 8
    Dernier message: 17/05/2005, 20h39
  2. [SGBD]Optimiser le temps d'accès aux données (schéma BD)
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 08/10/2004, 18h33
  3. [débutant] avoir accès aux données de la base BCDI 3
    Par Valichou dans le forum Bases de données
    Réponses: 7
    Dernier message: 06/05/2004, 13h13
  4. accès aux donnée d'un DBGRID
    Par relax_06 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/03/2004, 23h06
  5. [TDataModule] Intérêt de séparer les accès aux données?
    Par Cornell dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/09/2003, 16h42

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