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 :

Problème d'instantiation d'objets ?


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Problème d'instantiation d'objets ?
    Bonjour,

    Je suis confronté à une attitude de l'interpreteur que je ne comprend pas. Je me suis mis à Python il y a quelque temps et j'arrive maintenant à obtenir des resultats sympathique. Toutefois j'ai l'impression qu'il y a toujours certaines nuances qui m'echappent.
    Dernièrement je me suis retrouvé confronté à un problème que je n'arrive pas à résoudre. Je ne vous remet pas tout le code mais simplement un code exemple qui recréé le comportement que je ne comprend pas.

    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
    class Test():
        __Data__ = {}
        def __init__(self, list):
            self.treatL(list)
        def returnD(self):
            return self.__Data__ 
        def treatL(self, list):
            for i in range(len(list)):
                self.__Data__[list[i]]=i
     
     
     
    if __name__ == "__main__":
     
        l1 = ['1', '2']
        l2 = ['3','4','5','6','7','8']
     
        toto = Test(l1)
        dic = toto.returnD()
     
        print "premiere liste :"     
        for k in dic.keys():
            print k
     
        titi = Test(l2)
        serie2 = titi.returnD()
     
        print "deuxieme liste :"     
        for k in serie2.keys():
            print k
     
        print "premiere liste a nouveau :"     
        for k in dic.keys():
            print k
    Le resultat pour ce petit script est le 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
     
    premiere liste :
    1
    2
    deuxieme liste :
    1
    3
    2
    5
    4
    7
    6
    8
    premiere liste a nouveau :
    1
    3
    2
    5
    4
    7
    6
    8
    Premierement, la variable serie2 ce retrouve avec les clés 1 et 2. Il semblerait qu'on utilise pas une nouvelle instance de l'objet Test mais que les données précédentes sont toujours présentes.

    Ca me semble déjà relativement étrange. Mais la ou je suis complètement perdu, c'est lorsque ma variable dic qui était bien positionné se retrouve avec la valeur de serie2 sans que je l'ai touchée...

    Il s'agit certainement d'une petite notion en python que je ne connais pas, mais la j'avou que je suis perdu. Un expert python pourrait t'il m'eclairer sur le sujet ?


    PS : j'utilise pythonwin 2.6.1.

    Merci,

  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
    Test.__Data__ est "global" même si vous passez à travers dic pour y accéder.
    les Test(l1) et Test(l2) remplissent le même Test.__Data__.
    poussez __Data__ dans l'instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Test():
     
        def __init__(self, list):
            self.__Data__ = {}
            self.treatL(list)
        def returnD(self):
            return self.__Data__ 
        def treatL(self, list):
            for i in range(len(list)):
                self.__Data__[list[i]]=i
    Et vous aurez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    premiere liste :
    1
    2
    deuxieme liste :
    3
    5
    4
    7
    6
    8
    premiere liste a nouveau :
    1
    2
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Tout simplement ... ça m'apprendra à me jeter dans un langage sans passer par la case "bouquin ou tuto complet"

    Merci beaucoup pour cette réponse rapide, ça résout parfaitement mon problème. Par contre j’ai toujours un peu de mal à comprendre pourquoi la variable dic reprend la valeur suivante alors qu’elle n’est pas réaffectée. Est-ce que python renvoi juste une espèce de pointeur sur l'objet __data__ plutôt qu'une copie de la valeur de l'objet ?

  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
    Salut,
    Posez le crayon! dic est l'adresse d'une "collection".
    Si vous modifiez un des éléments de la collection, l'adresse de la collection n'a pas changé, son contenu oui.
    - W
    PS: Cette histoire de collection et de contenu vous jouera bien d'autres tours, ne désespérez pas, nous sommes tous passés par là
    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: 4
    Dernier message: 22/06/2015, 09h40
  2. [Sécurité] Problème de récupération d'objet sérialisé
    Par Mysticlolly dans le forum Langage
    Réponses: 6
    Dernier message: 31/03/2006, 14h16
  3. [generics] instantier un objet
    Par Bobo59 dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2005, 09h47
  4. [hibernate]Problème de récupération d'objet...
    Par roxx62 dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2005, 11h36
  5. Réponses: 14
    Dernier message: 02/03/2005, 18h15

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