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éfinition d'un objet contenant des sous-objets


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Définition d'un objet contenant des sous-objets
    Bonjour,

    Je souhaite définir un objet contenant des informations avec une architecture du type :

    avec les Ai, Bi et Ci des chaines de caractères ou des flottants.

    J'aimerai par la suite pouvoir lister le les champs de mon objet, par exemple :
    print objet.A1.B1 donnerait C1
    print objet donnerait A1 et A2
    print objet.A2 donnerait B1, B2 et B3
    etc ...
    J'ai essayé avec les classes, les listes mais je n'y arrive pas (je suis débutant en python ).

    Quelqu'un a une idée?

    Merci!


    Edit : Je me suis trompé de discution, pouvez vous le transférer dans général python? Merci

  2. #2
    Membre éprouvé

    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
    Points : 923
    Points
    923
    Par défaut
    Si c'est juste pour stocker des informations dans une collection, un dictionnaire peut suffire.
    Si tu donnes un peu plus de détails, il sera plus facile de t'aiguiller, parce que pour moi ça reste flou...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    objet = {'A1': {'B1': ['C1'], 'B2': ['C1', 'C2']},
             'A2': {'B1': ['C2'], 'B2': ['C1', 'C2'], 'B3': ['C2', 'C3']}}

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Gyslain Voir le message

    avec les Ai, Bi et Ci des chaines de caractères ou des flottants.
    Impossible. Ton schéma montre que Ai et Bi sont des conteneurs (dest trucs qui contiennent d'autres trucs), pas des types simples comme des strings ou des float.
    Les Ci peuvent effectivement être des types simples...

    Par ailleurs un objet contient des membres. Par exemple l'objet "voiture" contiendra la valeur "nb de roues", "couleur", "marque". Le nom de ces membres est fixe. Le membre "marque" sera toujours nommé "marque".
    Or dans ton exemple, l'objet A1 contient le membre nommé "B1" et l'objet A2 contient le membre nommé "B1" et "B2". Ca ne peut pas le faire. B1 et B2 peuvent être des valeurs (par exemple tu peux les stocker dans le mebre "listeValeurs" mais pas des noms de membres

    Citation Envoyé par Gyslain Voir le message
    J'aimerai par la suite pouvoir lister le les champs de mon objet, par exemple :
    print objet.A1.B1 donnerait C1
    print objet donnerait A1 et A2
    print objet.A2 donnerait B1, B2 et B3
    Hé justement non. La syntaxe objet.A1 laisse supposer que "objet" contient un membre nommé "A1" alors que ce n'est pas le cas. A1 et A2 sont des valeurs stockées dans le membre "listeValeurs" de "objet". Tu pourras afficher "objet.listeValeurs" ce qui te donnera (A1, A2) mais pas objet.A1 !!!

    Imaginons que t'aies un objet "vehicule" contenant "nb_roues". Tu définis donc une variable "voiture" de type "vehicule" et tu dis "voiture.nb_roues=4" et une variable "moto" de type "vehicule" et tu dis "moto.nb_roues=2"
    Ben si on suit ton exemple, c'est comme si on cherchait à taper dans "voiture.4" et "moto.2" alors qu'en réalité, il faut taper dans "voiture.nb_roues" et "moto.nb_roues"...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci pour les réponses!

    En effet, on ne peut pas définir un tel objet avec les classes.

    Je m'en suis sortis en exploitant l'idée de oiffrig avec les dictionnaires.

    Voici mon script pour les intéressés :

    j'ai un fichier b.data contenant des données séparées par ":"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Linux1:version_3.2:T_ox:20.
    Linux1:version_3.2:T_ga:23.
    Linux2:version_3.2:T_ox:100.
    Linux2:version_3.3:T_ox:10.
    theorique:theorique_A:T_ga:100.
    theorique:theorique_B:P_ox:15.
    Le 1er champ coresspond à la version du système, le 2nd à la version du logiciel, le 3eme à la grandeur, le 4eme à la valeur associé.

    ensuite j'enregistre les données du fichier avec le script suivant :
    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
     
    #!/usr/bin/python
     
    tnr2 = open('b.data','r')
    ref = {}
     
    for ligne in tnr2 :
       ligne = ligne.strip()
       resultat = ligne.split(":")
       machine = resultat[0]
       version = resultat[1]
       grandeur = resultat[2]
       valeur = resultat[3]
       if ref.has_key(machine) :
          if ref[machine].has_key(version) :
             ref[machine][version][grandeur] = valeur
          else :
             grd = {}
             grd[grandeur] = valeur
             ref[machine][version] = grd
       else :
          grd = {}
          grd[grandeur] = valeur
          ver = {}
          ver[version] = grd
          ref[machine] = ver
     
    print 'ref = ', ref
     
    for machine in ref.keys() :
       print machine
       for version in ref[machine].keys() :
          print '   ', version
          for grandeur in ref[machine][version].keys() :
             print '      ', grandeur, ' : ', ref[machine][version][grandeur]
    Et j'obtiens bien la structure attendue (voir shéma du 1er post) :
    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
     
    ref =  {'Linux1': {'version_3.2': {'T_ox': '20.', 'T_ga': '23.'}}, 'Linux2': {'version_3.3': {'T_ox': '10.'}, 'version_3.2': {'T_ox': '100.'}}, 'theorique': {'theorique_A': {'T_ga': '100.'}, 'theorique_B': {'P_ox': '15.'}}}
    Linux1
        version_3.2
           T_ox  :  20.
           T_ga  :  23.
    Linux2
        version_3.3
           T_ox  :  10.
        version_3.2
           T_ox  :  100.
    theorique
        theorique_A
           T_ga  :  100.
        theorique_B
           P_ox  :  15.
    Merci bien

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

Discussions similaires

  1. Creation objet avec des sous objets
    Par eleon_7 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 22/11/2012, 15h03
  2. [Debutant] Insertion systématique des sous objets
    Par Arsenic68 dans le forum Entity Framework
    Réponses: 8
    Dernier message: 06/07/2010, 20h44
  3. Réponses: 10
    Dernier message: 10/10/2009, 18h39
  4. Réponses: 1
    Dernier message: 03/01/2008, 17h20
  5. [castor] MappingTool objet contenant des list
    Par totoranky dans le forum Persistance des données
    Réponses: 1
    Dernier message: 28/03/2007, 17h48

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