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 :

assigner dynamiquement les valeurs aux attributs d'un objet


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 36
    Par défaut assigner dynamiquement les valeurs aux attributs d'un objet
    Bonjour , j'essaye de créer un "petit logiciel" pour répertorier des animaux. Il existe une classe Animal, qui me pond des objets correspondants aux animaux qui atterrissent à la SPA.Il s'agit d'un exercice pratique et utile.

    Je ne connais donc pas à l'avance l’espèce,ni la race,ni le sexe,ni le poids etc.Mais qu'il s'agisse d'un chat de 2k ou d'un berger allemand de 15 kg , ils appartiennent tous deux à la classe Animal , pour ne pas compliquer les choses.

    Il y aura également une classe Hebergeur, pour ceux qui viendront adopter , donc comme attribut ici:nom,adresse,n° tel,email etc. qu'il faudra saisir. Grace à un menu , on choisit de créer un objet animal ou un objet hebergeur , ou seulement de consulter ou éditer partiellement.

    J'ai prévu de saisir les bonnes valeurs grâce à des inputs qui stockent temporairement l'info dans une liste , qui elle meme devrait se redeverser dans un objet afin de le stocker dans un fichier "data". Mais évidement j'ai rencontré des problèmes...Voici donc le code :

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
     
    # -*- coding: cp1252 -*-
    from os import system
    import pickle
    import os
    import pickle
    import copy
    liste_desc_animal = []
    dico_desc_animal = {}
     
    #----------------------------------- Classe Animal definition --------------------- 
    class Animal:
    def __init__(self, id_animal,espece,race,prenom_animal,date_naiss_animal,date_acc_spa,sexe,sterilise_statut,robe,poil,pesee_acc,rdv_veto,caractere,commentaire):
     
    self.__id_animal = id_animal # int 
    self.__espece = espece # int
     
    self.__race = race # liste 
    self.__prenom_animal = prenom_animal # string
     
    self.__date_naiss_animal = date_naiss_animal # dates
    self.__date_acc_spa = date_acc_spa # dates 
     
    self.__sexe = sexe # boleen
    self.__sterilise_statut = sterilise_statut # boleen
     
    self.__robe = robe # liste
    self.__poil = poil # liste
     
    self.__pesee_acc = pesee_acc # float
     
    self.__rdv_veto = rdv_veto # dates
     
     
    self.__caractere = caractere # liste
    self.__commentaire = commentaire # string
     
    #-----------------------------------SET---------------------
    def setId_animal(self, id_animal):
    self.__id_animal = id_animal 
     
    def setEspece(self, espece):
    self.__espece = espece 
     
    def setRace(self, race): 
    self.__espece = espece 
     
    def setPrenom_animal(self, prenom_animal): 
    self.__prenom_animal = prenom_animal 
     
    def setDate_naiss_animal(self, date_naiss_animal): 
    self.__date_naiss_animal = date_naiss_animal 
     
    def setDate_acc_spa(self, date_acc_spa): 
    self.__date_acc_spa = date_acc_spa 
     
    def setSexe(self, sexe): 
    self.__sexe = sexe 
     
    def setSterilise_statut(self, sterilise_statut): 
    self.__sterilise_statut = sterilise_statut 
     
    def setRobe(self, robe): 
    self.__robe = robe 
     
    def setPoil(self, poil): 
    self.__poil = poil 
     
    def setPesee(self, pesee_acc): 
    self.__pesee_acc = pesee_acc 
     
    def setRdv_veto(self, rdv_veto): 
    self.__rdv_veto = rdv_veto
     
    def setCaractere(self, caractere): 
    self.__caractere = caractere
     
    def setCommentaire(self, commentaire): 
    self.__commentaire = commentaire 
    #-----------------------------------GET--------------------- 
    def getEspece(self):
    return self.__espece
     
    def getRace(self): 
    return self.__race 
     
    def getPrenom_animal(self): 
    return self.__prenom_animal 
     
    def getDate_naiss_animal(self): 
    return self.__date_naiss_animal 
     
    def getDate_acc_spa(self): 
    return self.__date_acc_spa 
     
    def getSexe(self): 
    return self.__sexe 
     
    def getSterilise_statut(self): 
    return self.__sterilise_statut 
     
    def getRobe(self): 
    return self.__robe 
     
    def getPoil(self): 
    return self.__poil 
     
    def getPesee(self): 
    return self.__pesee_acc 
     
    def getRdv_veto(self): 
    return self.__rdv_veto 
     
    def getCaractere(self): 
    return self.__caractere 
     
    def getCommentaire(self): 
    return self.__commentaire 
    #--------------------------------------------- Remplissage liste descriptive du nouvel animal arrivant a la SPA ------
    def remplir_liste_desc_animal():
     
    entree_id = input("quel est l' id ? ==> ")
    entree_espece = input("quel est l' espece ? ==> ")
    entree_race = input("quel est la race ? ==> ")
    entree_prenom = input("quel est le prenom de l animal ? ==> ")
    entree_ddn = input("quelle est sa date de naissance ? ==> ")
    entree_dac = input("quelle est la date d accueuil a la SPA ? ==> ")
    entree_sex = input("quel est le sexe ? ==> ")
    entree_ster = input("Est il sterilise ? ==> ")
    entree_robe = input("quelle est sa robe ? ==> ")
    entree_poil = input("quel est son poil ? ==> ")
    entree_poids = input("quel est son poids d entree ? ==> ")
    entree_rdv = input("quel est son prochain rdv ? ==> ")
    entree_carac = input("quel est son caractere (calin-dangereux-solitaire-joueur-lunatique...? ==> ")
    entree_com = input("commentaire ? ==> ")
    print("\n\n")
    print(entree_id ) 
     
    liste_desc_animal.append(entree_id)
    liste_desc_animal.append(entree_espece)
    liste_desc_animal.append(entree_race)
    liste_desc_animal.append(entree_prenom)
    liste_desc_animal.append(entree_ddn)
    liste_desc_animal.append(entree_dac)
    liste_desc_animal.append(entree_sex)
    liste_desc_animal.append(entree_ster)
    liste_desc_animal.append(entree_robe)
    liste_desc_animal.append(entree_poil)
    liste_desc_animal.append(entree_poids)
    liste_desc_animal.append(entree_rdv)
    liste_desc_animal.append(entree_carac)
    liste_desc_animal.append(entree_com) 
     
    print(" Recapitulatif: \n ",liste_desc_animal) 
     
    #dico_desc_animal = {[id_animal] = [entree_id] }
     
     
    with open('liste_animaux.txt', 'wb') as fichier:
    mon_pickler = pickle.Pickler(fichier)
    mon_pickler.dump(liste_desc_animal)
    print("ceci a ete ajoute dans le fichier liste_animaux.txt ")
    #------------------------------------------- Creer un objet a partir d une liste --------
    def animalCreator(liste_desc_animal):
    #liste_desc_animal[2] = Animal(liste_desc_animal[0],liste_desc_animal[1],liste_desc_animal[2],liste_desc_animal[3],liste_desc_animal[4],liste_desc_animal[5],liste_desc_animal[6],liste_desc_animal[7],liste_desc_animal[8],liste_desc_animal[9],liste_desc_animal[10],liste_desc_animal[11],liste_desc_animal[12],liste_desc_animal[13])
    #entree_prenom = 
    print("voici liste_desc_animal connu dans la fonction animalCreator : ",liste_desc_animal)
    #------------------------------------------- affichage du menu -----------------------
    class Menu:
     
    def __init__(self):
    self.choix_menu = 'choix_menu'
     
     
    #self.__afficher_menu = afficher_menu
    def afficher_menu(self): 
     
    print(" 1. Creation de fiche pour un nouveau pensionnaire \n")
     
    print(" 2. Modifier une fiche pour un animal deja connu de la SPA \n")
     
    print(" 3. Affichage simple de la fiche pour un animal connu dans la base de donnees \n")
    print(" 4. Affichage ameliore des pensionnaires avec tri en fonction de vos besoins precis \n")
     
    print(" 5 Affichage du dernier pensionnaire enregistre dans la base de donnees \n")
     
    print(" 6. Creation de fiche pour un nouveau hebergeur \n")
     
    print(" 7. Modifier une fiche pour un hebergeur connu \n")
     
    print(" 8. Affichage simple de la fiche pour un hebergeur connu dans la base de donnees \n")
     
    print(" 9. Affichage ameliore des hebergeurs avec tri en fonction de vos besoins precis \n")
     
    print(" 10. Admin : maintenance de la base de donnees \n")
    print(" 11. contacts veterinaires \n")
    print(" 12. contacts fournisseurs \n")
    print(" 13. contacts mairie \n")
    #------------------------------------------- entree clavier choix du menu -----------------------
     
    def choisir_menu(self): 
    choix_menu = input(" Choisissez une action : --> ")
    print(" vous avez choisi : ",choix_menu)
    choix_menu = int(choix_menu)
    if choix_menu == 1:
    os.system('cls')
    remplir_liste_desc_animal()
    for desc in liste_desc_animal:
    nouvelanimal = Animal(desc)
     
    #--------------------------------------------- BOUCLE pour MENU_ACCUEUIL -------------
    a = True
    while a:
    #os.system('cls')
    print("\n\n\n")
    supermenu = Menu()
    supermenu.afficher_menu() 
    supermenu.choisir_menu() 
    animalCreator(liste_desc_animal)
    ferme = input("appuie pour fermer")
    ==> J'obtiens TypeError __init__() missing 13 required positional arguments 'espece','race',etc.
    Que feriez vous à ma place ? Existe t il d'autre façon plus simple de mener à bien ce type de programme ?
    Vous arrive t il d'assigner vos attributs d'objets en cours d'execution du programme ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Pourquoi ton code n'est-il pas indenté ?

    L'usage des setter et getter est généralement réservé aux properties, en python pour accéder à un attribut d'instance on utilise la simple syntaxe instance.attribut.

    Problème, tu as privatisé tes attributs en leur collant un double tirêt. Pourquoi diable ?

    Ton message d'erreur indique que le premier argument manquant est 'espece' ce qui signifie que l'argument 'id_animal' a reçu la 'liste_desc_animal' dans son entièreté pour valeur.

    Si tu utilises un dictionnaire, tu pourras te simplifier la vie de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Animal():
        def __init__(self, args):
            for key, value in args.items():
                setattr(self, key, value)
     
     
    dct = {'ID': 18, 'espece': 'levrier', 'poid': 12, 'couleur': 'roux'}
    a = Animal(dct)
     
    print(' %s\n %s\n %s\n %s\n' %(a.ID, a.espece, a.poid, a.couleur))


    C'est quoi ça: 'os.system('cls') ?

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Compte tenu de la nature du problème, je pencherais plutôt pour une base de données relationnelle:
    - une table pour les animaux
    - une table pour les personnes concernées
    - une table pour les hébergements (lien entre les 2 tables précédentes)

    Un des avantages est que l'on peut questionner la base de données à tout moment avec un script sql, y compris pour poser des questions qui n'ont pas été prévues au départ (ce qu'une solution entièrement programmée aura du mal à faire).

    On peut faire ça sous Python qui est livré avec sqlite3. Sqlite3 n'est pas un serveur et doit donc n'être utilisé qu'avec un seul programme à la fois. Mais il est largement assez puissant pour faire ça, tant en rapidité qu'en fonctionnalités (même s'il y avait 10000 animaux à gérer). Cependant, pour gérer plus confortablement, ce serait bien d'utiliser une bibliothèque graphique capable d'afficher et de modifier les tables (PyQt?).

    On peut aussi gérer cette base de données sqlite3 avec un logiciel graphique tout fait: il y en a plusieurs de gratuits (chercher dans google: "sqlite manager"). Il y a même un plugin Firefox.

    Mais, bien sûr, si c'est un exercice de POO en Python, tu peux continuer comme tu as commencé!

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 36
    Par défaut
    merci à vous deux !

    cls via os , me permet d'effacer l’écran ; l'indentation a disparu maladroitement suite à un copier coller sur une autre interface.

    Je vais tacher d'appliquer vos conseils a+

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut Tyrtamos,

    Le PO a déjà poste son code sur le forum du zéro. Il lui a été gentiment indique de retourner potasser classes, constructeurs, fonctions,... : les trucs de bases.

    Sinon, os.system('cls') est une commande de la console windows qui effectue "CLear Screen" comme son nom l'indique.
    Je ne comprends pas pourquoi demander a __init__ de recopier un dict reçu en paramètre dans le dict de l'instance:
    Pourquoi ne pas oser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Animal():
          pass
     
    a = Animal(dct)
    a.__dict__ = {'ID': 18, 'espece': 'levrier', 'poid': 12, 'couleur': 'roux'}
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/10/2008, 20h26
  2. [DOM] changer les valeurs des attributs d'un fichier XML
    Par nonna dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 21/03/2008, 11h56
  3. [plot] Modifier dynamiquement les valeurs tracées sur un graphique
    Par mr_samurai dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 19/02/2008, 15h37
  4. Réponses: 6
    Dernier message: 16/10/2007, 15h49
  5. Réponses: 3
    Dernier message: 09/06/2007, 01h28

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