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 :

Récupérer TOUS les attibuts d'un objet


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut Récupérer TOUS les attibuts d'un objet
    Bonjour à tous
    alors voila, je me demandais si il existait une méthode qui permet de récupérer l'ensemble des attributs d'un objet.

    Je m'explique, admettons qu'une classe définisse l'objet suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    file_1=open('sauvegarde.txt','a')  #Fichier de sauvegarde
     
    class point:                               #objet point
        def __init__(self,x=0,y=0,z=0):
            self.x=x
            self.y=y
            self.z=z
     
    #Main
    A=point(2,4,6)
    Si je souhaite enregistrer le point A dans un fichier texte je suis obligé d'ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_1.write(str(A.x)+str(A.y)+str(A.z))   #La mise en page sera trés moche mais la question n'est pas la :)
    Mais je me demandais si il n'existait pas une méthode qui permettrait de récupérer l'ensemble des attributs facilement.
    Parce que tout vas bien dans le cas d'un objet avec trois attributs, mais si je manipule des objets qui ont plusieurs dizaine d'attributs que je veux sauvegarder...

    Ca existe??
    Merci

    julien

  2. #2
    Membre chevronné
    Avatar de kedare
    Homme Profil pro
    Network Automation Engineer
    Inscrit en
    Juillet 2005
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Network Automation Engineer

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 548
    Points : 1 861
    Points
    1 861
    Par défaut
    Si tu veux enregistrer les attributs d'un objet, ca serais pas mieux d'utiliser la sérialisation ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    Certes...Mais késako?

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Un truc à connaître :
    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
    #!/usr/bin/env python
    #coding=utf-8
    file_1=open('sauvegarde.txt','a')  #Fichier de sauvegarde
     
    class point:                               #objet point
        def __init__(self,x=0,y=0,z=0):
            self.x = x
            self.y = y
            self.z = z
     
        def __str__(self):
            # Ecriture personnalisée des attributs
            return '[' + str(self.x) + ' ; ' + str(self.y) + ' ; ' + str(self.z) + ']'
    #Main
    A=point(2,4,6)
     
    print str(A)
    Le code te renvoie :

  5. #5
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Effectivement, dans ton cas, la sérialisation est la bonne solution. Utilise pour ça le module pickle ou shelve
    http://docs.python.org/library/pickle.html

    Exemple (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # Il te faut bien sur un fichier
    f = open("myFile.dat", "w")
     
    # Lecture d'un object
    obj = pickle.load(f, pickle.HIGHEST_PROTOCOL
     
    # Ecriture de l'objet
    pickle.dump(object, f, pickle.HIGHEST_PROTOCOL)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    Bon aprés avoir fureter sur net et effectué quelque test, je pense avoir compris l'utilité du module Pickle:
    Cela permet de convertir en une chaine de characère un objet afin de pouvoir le stocker ou l'envoyer sur un réseau...Mais pour être réutiliser plus tard (avec la méthode ".loads"). Parce que en stockage pur ca fais quand même un beau bazar for peu "user friendly" a moins qu'il y ai des feintes...

    Par exemple voici le résultat d'un pickle.dump sur l'objet défini plus haut:
    (i__main__
    point
    p1
    (dp2
    S'y'
    I3
    sS'x'
    I2
    sS'z'
    I4
    sb.

    Ce qui n'est pas super simple à lire...et sous entend des opérations de "nettoyage" derriere...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    @Rambc: Merci pour ce petit truc.
    Cependant je ne peux l'utiliser dans mon cas puisque je n'ai pas accés à l'objet en question. Il a été écris par d'autres personnes, dans d'autres équipes...Je n'ai qu'une spec (peu claire d'ailleurs, comme toute spec qui se respecte...)

  8. #8
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    Ok, et bien merci de m'avoir fais découvrir le module pickle.
    Ceci dit, existerai t-il une méthode pour avoir le résultat de maniere "lisible"?
    parce la c'est difficile d'extraire les informations

    Par exemple voici le résultat d'un pickle.dump sur l'objet défini plus haut:
    (i__main__
    point
    p1
    (dp2
    S'y'
    I3
    sS'x'
    I2
    sS'z'
    I4
    sb.

  10. #10
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Mais je me demandais si il n'existait pas une méthode qui permettrait de récupérer l'ensemble des attributs facilement.
    Tu peux utiliser dir et/ou __dict__:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Point(object):
     
        def __init__(self, x=0, y=0, z=0):
     
            self.x = x
            self.y = y
            self.z = z
     
     
    p = Point(1,2,3)
     
    print dir(p)
    print p.__dict__
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Points : 131
    Points
    131
    Par défaut
    EXCELLENT!
    Parfait,merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/06/2011, 15h05
  2. Récupérer tous les objets d'une application
    Par Chacha35 dans le forum Windows Forms
    Réponses: 25
    Dernier message: 02/11/2009, 13h14
  3. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 13h26
  4. Réponses: 7
    Dernier message: 08/01/2005, 13h24
  5. [Plugin] Récupérer tous les fichiers *.java d'un workspace
    Par Satch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 02/06/2004, 12h51

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