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 :

liste d'objets POO [Python 2.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 16
    Points
    16
    Par défaut liste d'objets POO
    Bonjour,
    je patoge depuis 2 jours dans un bout de code qui devrait être simple, mais je n'arrive pas à m'en sortir.
    J'ai créé une classe individu dans laquelle j'ai:
    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
     
    class Individual:
        """Cette classe possède un attribut de classe qui s'incrémente à chaque
        fois que l'on crée un objet de ce type"""
     
        id_ind = 0 # Le compteur vaut 0 au départ
     
        def __init__(self,age, sexe):
     
            """À chaque fois qu'on crée un objet, on incrémente le id_ind"""
            Individual.id_ind = Individual.id_ind + 1
            Individual.age = int(age) * 12
            Individual.sexe = sexe
     
     
        def __str__(self):
     
            """Méthode appelée lors d'une conversion de l'objet en chaîne"""
            return "{0} {1} {2} {3}".format(self.id_ind, self.age, self.sexe)
     
     
    class Obese(Individual):
     
        """Classe définissant un individu étudié dans les simulations de l'obésité.
            Elle hérite de la classe Individual"""
     
        def __init__(self, age, sexe, ob_indicator):
     
            Individual.__init__(self, age, sexe)
     
            self.id_obese = Individual.id_ind
            self.ob_indicator = ob_indicator
     
        def getIDobese(self):
            return self.id_obese
     
        def get_age(self):
            return (self.age)
     
        def aging (self):
            self.age = self.age+1    
     
        def __str__(self):
     
            """Méthode appelée lors d'une conversion de l'objet en chaîne"""
     
            xx= self.age/12
            return " l'individu {0}: {1} ans, {2}.".format(self.id_obese, str(xx), self.ob_indicator)

    Par la suite,j'ai récupéré ces données à partir d'un fichier csv, et je les ai mis dans une liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in xrange(1, len(liste)):
                    sexe = liste[i][2]
                    age = liste[i][3]
                    ob_indicator = liste[i][4]
                    personne = concept.Obese(age, sexe, ob_indicator)
                    list_individuals.append(personne.getObese())
    jusque là tout va bien, j'ai une liste d'individus.
    Le problème, c'est que je ne veux pas d'une liste d'individus, mais une liste d'objets individus, de telle sorte que si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    list_individuals[0].aging()
    l'age de l'individu s'incrémente automatique. Or tel que je l'ai déclaré, il s'agit d'un tuple ne contenant que les valeurs des paramètres de chaque objet, mais pas l'objet lui même.


    en faisant des recherches, j'ai trouvé que je devrais faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list_individuals= [concept.Obese()for i in (range(nombre_lignes_fichier_lu))]
    mais je ne sais pas si c'est la bonne piste ou pas ? et je ne vois pas comment je vais instancier les valeurs de chaque objet de la liste.

    Quelqu'un aurait-il une idée la dessus ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Je ne vois pas à quoi correspond "personne.getObese()" dans les bouts de code que vous avez montré.

    Pourquoi ne pas écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          for i in xrange(1, len(liste)):
                    sexe = liste[i][2]
                    age = liste[i][3]
                    ob_indicator = liste[i][4]
                    personne = concept.Obese(age, sexe, ob_indicator)
                    list_individuals.append(personne)
    Lorsque vous écrivez:
    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
    class Individual(object):
        """Cette classe possède un attribut de classe qui s'incrémente à chaque
        fois que l'on crée un objet de ce type"""
     
        id_ind = 0 # Le compteur vaut 0 au départ
     
        def __init__(self, age, sexe):
     
            """À chaque fois qu'on crée un objet, on incrémente le id_ind"""
            Individual.id_ind = Individual.id_ind + 1
            Individual.age = int(age) * 12
            Individual.sexe = sexe
     
     
        def __str__(self):
     
            """Méthode appelée lors d'une conversion de l'objet en chaîne"""
            return "{0} {1} {2} {3}".format(self.id_ind, self.age, self.sexe)
    "age" et "sexe" sont des variables de classe. Leur valeur va changer pour toutes les instances alors que vous voulez garder les valeurs passées à __init__.
    Pareil pour id_ind mais vous contre-pédalez dans la s/classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Obese(Individual):
     
        """Classe définissant un individu étudié dans les simulations de l'obésité.
            Elle hérite de la classe Individual"""
     
        def __init__(self, age, sexe, ob_indicator):
     
            Individual.__init__(self, age, sexe)
     
            self.id_obese = Individual.id_ind
    En stockant la dernière valeur dans un attribut d'instance.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    J'avoue que je n'ai pas très bien compris votre suggestion.
    L'idée à la base c'est de faire hériter la classe obèse de la classe individual, que je ne vais pas utiliser par la suite. J'ai juste pour mettre en valeur que tout obèse est un individu avec des propriétés indépendantes de "la maladie". Comme les propriétés age et sexe sont relatifs à l'individu et pas à l'obèse, je les instancie dans la classe individuals.
    D'après ce que j'ai cru comprendre c'est comme ça qu'il faut procéder dans la classe fille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Obese(Individual):
     
        """Classe définissant un individu étudié dans les simulations de l'obésité.
            Elle hérite de la classe Individual"""
     
        def __init__(self, age, sexe, ob_indicator):
     
            Individual.__init__(self, age, sexe)  # initialiser les attributs de la classe mère puis ceux de la classe fille
     
            self.id_obese = Individual.id_ind  # je veux que les id soient les mêmes car dans ma population je n'ai que les obèses
     
            self.ob_indicator = ob_indicator

    Pour ce qui est de la liste dans la déclaration de la classe, ça contredit le concept objet non ? je ne peux pas déclarer une liste d'obèses dans la déclaration même de la classe mère individual, si j'ai bien compris votre suggestion.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par marie_87 Voir le message
    Comme les propriétés age et sexe sont relatifs à l'individu et pas à l'obèse, je les instancie dans la classe individuals.
    D'après ce que j'ai cru comprendre c'est comme ça qu'il faut procéder dans la classe fille:
    Le problème est de savoir ce que vous voulez! En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Individual(object):
        """Cette classe possède un attribut de classe qui s'incrémente à chaque
        fois que l'on crée un objet de ce type"""
     
        id_ind = 0 # Le compteur vaut 0 au départ
     
        def __init__(self, age, sexe):
     
            """À chaque fois qu'on crée un objet, on incrémente le id_ind"""
            Individual.id_ind = Individual.id_ind + 1
            Individual.age = int(age) * 12
            Individual.sexe = sexe
    La création de l'individual suivant écrase les attributs du précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> a = Individual(12, 'm')
    >>> a.sexe
    'm'
    >>> a.age
    144
    >>> b = Individual(22, 'f')
    >>> b.age
    264
    >>> b.sexe
    'f'
    Mais on a écrabouillé "a":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a.age
    264
    >>> a.sexe
    'f'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Vous avez raison, je ne voyais pas du tout ce problème, puisque je ne comptais pas utiliser la classe individual, mais je suppose que le problème reste le même posé avec la classe obese.
    Mon idée, était de mettre chaque obèse dans un élément d'une liste d'objets, chose que j'ai du mal à faire pour l'instant, notamment pour accéder aux méthodes. Car la liste marche convenablement avec les attributs, avec la fonction getObese() de la classe obese:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def getObese(self):
            #fonction qui retourne l'objet individu
            return self.id_obese, self.ob_indicator
    mais si je fais , cette méthode n'est pas reconnue, ce qui est normal, je n'alimente la liste que par les attributs.
    Or j'ai besoin que ce soit une liste d'objets.


    Et j'avoue que je n'ai pas compris votre proposition de la variable W. Que me suggérez-vous de faire ? Et pensez-vous que cela puisse m'aider à créer la liste d'objets qui reconnait les méthodes de la classe ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par marie_87 Voir le message
    Mon idée, était de mettre chaque obèse dans un élément d'une liste d'objets, chose que j'ai du mal à faire pour l'instant, notamment pour accéder aux méthodes. Car la liste marche convenablement avec les attributs, avec la fonction getObese() de la classe obese:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def getObese(self):
            #fonction qui retourne l'objet individu
            return self.id_obese, self.ob_indicator
    Dans le premier post, vous construisiez votre liste ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i in xrange(1, len(liste)):
                    sexe = liste[i][2]
                    age = liste[i][3]
                    ob_indicator = liste[i][4]
                    personne = concept.Obese(age, sexe, ob_indicator)
                    list_individuals.append(personne.getObese())
    "getObese" retourne un tuple et non un "Obese".

    Je vous ai proposé d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i in xrange(1, len(liste)):
                    sexe = liste[i][2]
                    age = liste[i][3]
                    ob_indicator = liste[i][4]
                    personne = concept.Obese(age, sexe, ob_indicator)
                    list_individuals.append(personne)
    Autrement dit, si vous voulez construire une liste d'Obese, il suffit d'y mettre des Obeses ...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Vous avez raison, c'était aussi simple que ça.
    Merci pour tout

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

Discussions similaires

  1. pre allocation mémoire pour liste d'objet (poo)
    Par masson.cle dans le forum MATLAB
    Réponses: 0
    Dernier message: 19/05/2012, 22h26
  2. [POO] Liste d'objets
    Par Nillak dans le forum Langage
    Réponses: 8
    Dernier message: 05/12/2007, 02h33
  3. Aide sur POO :: Classe et liste d'objet
    Par Andry dans le forum Langage
    Réponses: 1
    Dernier message: 23/01/2006, 15h51
  4. [Kylix] Composant - Liste d'objet
    Par Metal3d dans le forum EDI
    Réponses: 1
    Dernier message: 13/12/2002, 22h17
  5. liste d'objets
    Par Pierrot dans le forum Langage
    Réponses: 2
    Dernier message: 27/09/2002, 09h56

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