+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    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 : 0
    Points
    0

    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 :
    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 :
    1
    2
    3
    4
    5
    6
    from mere import mere
    class fille1(mere):
        _num = "1"
     
    class fille2(mere):
        _num = "2"
    et mon main :
    Code :
    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 :
    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 Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 957
    Points : 3 008
    Points
    3 008

    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__().
    Vincent
    Oqapy . Qarte . PaQager

  3. #3
    Invité de passage
    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 : 0
    Points
    0

    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 Confirmé Sénior
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 360
    Points : 4 245
    Points
    4 245
    Billets dans le blog
    1

    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 :
    1
    2
    3
    4
    5
    class fille1(mere):
        _num = "1"
     
        def __init__(self, nom, prenom, type):
            mere.__init__(self, nom, prenom, type)
    Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
    Mes recettes python: http://www.jpvweb.com

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •