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 :

Dictionnaires et Heritage


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Dictionnaires et Heritage
    Bonjour,
    Je m'inscris aujourd'hui car en temps normal, je trouve des sujets de problèmes similaires afin de résoudre les miens. Cependant, je ne trouve pas de solution à mon problème. (peut-être que j'ai mal cherché car je ne pense pas être le premier avec ce probleme)

    J'ai fait un petit code rapide afin de rendre compte de mon probleme.
    (le probleme porte sur un projet plus conséquent, mais il est identique)

    classe mere :
    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
    class mere(object):
        _num=0
        __default_params = {
                         "num" : "",
                         "nom" : "",
                         "prenom": "",
                         "type" : ""}
        __num = None
        __nom = None
        __prenom = None
        __type = None
     
     
        def __init__(self,nom,prenom,type):
            aux = {"num":self._num,"nom":nom,"prenom":prenom,"type":type}
            self.__default_params.update(aux)
            self.__num = self._num
            self.__nom = nom
            self.__prenom = prenom
            self.__type = type
     
        def pr(self):
            print self.__default_params,
            print self.__nom,
            print self.__num,
            print self.__prenom,
            print self.__type
    classes filles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from mere import mere
    class fille1(mere):
        _num = "1"
     
    class fille2(mere):
        _num = "2"
    et mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from fille import fille1
    from fille import fille2
     
    if __name__ == '__main__':
        f1 = fille1("name1","firstname1","type1")
        f2 = fille2("name2","firstname2","type2")
     
        f1.pr()
        f2.pr()
    le resultat obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {'nom': 'name2', 'prenom': 'firstname2', 'num': '2', 'type': 'type2'} name1 1 firstname1 type1
    {'nom': 'name2', 'prenom': 'firstname2', 'num': '2', 'type': 'type2'} name2 2 firstname2 type2
    Voila, comme vous pouvez le voir, les attributs "normaux" sont bons.
    Par contre, le dictionnaire est toujours celui créé par la derniere instance créée.

    Quelqu'un aurait-il une idée/solution d'où vient le problème?

    Merci d'avance

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Les attributs déclarés avec la classe, donc avant __init__(), sont des attributs de classe et non d'instance. Ils sont identiques pour toutes les instances de cette classe.

    Si ce n'est pas le but, alors tu dois les déplacer dans __init__().

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci!
    En effet, j'avais bien compris le principe des attributs de classe et d'instance.
    Mais je ne savais pas que la différence se faisait ainsi.
    (Le problème de garder les automatismes des autres langages quand on en apprend un autre.)

    Merci!

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Rien ne t'empêche d'avoir des variables de classe, si tu veux que les valeurs soient partagées par toutes les instances de la classe. Dans ce cas, il ne faut pas les préfixer par "self" qui est l'adresse de l'instance de classe, mais par le nom de la classe: ici "mere". Ce qui donnerait, par exemple: mere._num.

    Autre chose: la classe qui hérite doit appeler explicitement l'initialisation de la classe mère comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class fille1(mere):
        _num = "1"
     
        def __init__(self, nom, prenom, type):
            mere.__init__(self, nom, prenom, type)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

Discussions similaires

  1. Un fichier dictionnaire ?
    Par portu dans le forum Windows
    Réponses: 6
    Dernier message: 17/04/2007, 15h26
  2. [Kylix] heritage multiple et interfaces :(
    Par le_barbu dans le forum EDI
    Réponses: 4
    Dernier message: 26/01/2004, 19h30
  3. [Postgres] Pb d'heritage...
    Par anonia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h34
  4. [HERITAGE] Redondance ou pas redondance ???
    Par cyrillus76 dans le forum Schéma
    Réponses: 1
    Dernier message: 11/06/2003, 09h46
  5. [PostgreSQL] Question vis a vis de l'heritage...
    Par Gandalf dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/05/2003, 16h53

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