Merci pour vos réponses, rapides et claires.
J'avoue que je ne faisais la différence entre les structures natives et les dict/list.
Mais je pense avoir pigé le raisonnement.
"Pour l'honneur" :
Pour un non-initié, c'est quand même contre-intuitif, comme si les objets étaient poreux entre eux si on n'ajoute pas une couche de vernis sur les bords
Pour info, je viens de Java et suis arrivé sur Python par Django, et ce problème d'initialisation ne paraissait pas lors de l'utilisation des classes d'entités de bd, et où les attributs sont définis non en constructeur, mais en attribut "sous la classe" (sais pas comment dire).
Il semble aussi que je sois passé à travers des nouvelles syntaxes de la 2.7. Dire que je dois me mettre à la 3+...
"Et pour poursuivre" :
J'avais effectivement ajouté un constructeur à la classe mère pour palier le "problème".
MAIS je constatais en utilisant pdb.set_trace() qu'il n'était pas appelé lors de l'instanciation.
Ce que je viens de réaliser, c'est que, comme j'étais en héritage multiple, il suffit que la première classe ait un constructeur pour que le constructeur de la seconde classe ne soit pas appelé.
Traduction : dans ce cas :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Mother(object):
def __init__(self):
test = []
def get_test(self):
self.test.append(1)
return self.test
class Father(object):
def __init__(self):
pass
class Child(Mother, Father):
pass
for child in [Child(), Child(), Child(), Child(), Child()]
print len(child.get_test()) |
on obtient bien 1, 1, 1, 1, 1.
Mais avec
1 2
| class Child(Father, Mother):
pass |
on retombe sur 1, 2, 3, 4, 5.
J'ai résolu mon problème puisque pour l'instant, je peux intervertir les héritages (enfin, j'espère !).
Mais pour bien faire les choses, ma question serait maintenant : en cas d'héritage multiple, comment invoquer l'ensemble des constructeurs des classes mères ? Va-t-il falloir jongler avec les super(Child, self).__init__(args, kwargs) ?
--
edit : Correction -> je viens de porter les modifications sur le code de développement, et non, mon problème persiste. Ou plutôt, il évolue : maintenant, c'est un jeu pas très net entre mes constructeurs et ceux de Django...
edit 2 : ça y est, je m'en sors (j'avais ajouté un constructeur là où il valait mieux pas, i.e. dans une classe directement gérée par Django...).
Partager