Je débute en Python et j'écris de tous petits programmes de test pour m'aider à comprendre. Je connais assez bien, je pense, les principes OO et la manière de les coder en Java.
Mon but n'est pas de faire des comparaisons entre les principes de bases qui régissent les classes et leurs variables dans chacun des langages, chacun voit midi à sa porte,mais je n'arrive pas à comprendre le résultat du programme suivant. Plus exactement, je ne trouve pas dans la doc. officielle Python le principe qui donnerait une explication logique au résultat de mon test:
L'exécution donne comme je m'y attendais les nombres 3, 3, 3, 3. Lorsque j'utilise self.__class__.numberOfInstance += 1 que je décommente au lieu de
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 class parent: # class variable numberOfInstance = 0 def __init__(self, arg1): # an instance variable self._instVar1 = arg1 parent.numberOfInstance += 1 # self.__class__.numberOfInstance += 1 class child(parent): def __init__(self, arg1, arg2): # an instance variable for child self._instVar2 = arg2 super().__init__(arg1) p1 = parent('an arg') p2 = parent('an arg') p3 = child('an arg', 'another') print(p2.numberOfInstance) print(p3.numberOfInstance) print(child.numberOfInstance) print(parent.numberOfInstance)
parent.numberOfInstance += 1 que je commente le résultat devient
Après quelques recherches, j'ai trouvé que la variable numberOfInstance est dupliquée dans la sous-classe lors de la première exécution de self.__class__.numberOfInstance += 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 2 3 3 2 Process finished with exit code 0
lorsque la classe est de type child. Dès ce moment, il y a deux variables de classe, une dans chaque classe.
Comment expliquer par un des principes de Python que l'incrémentation, dans le cas d'un objet de type child lise la valeur dans la variable de la classe parent ,
incrémente puis écrive la nouvelle valeur dans une nouvelle variable de classe créée dans la sous classe?
Pour moi, c'est contre-intuitif puisque la variable de classe dans child est héritée de parent, et l'accès devrait pouvoir se faire par parent ou child.
Je pense que cela a un lien avec le comportement de Python relatif à la portée des variables et aux espaces de noms, non ?
Merci par avance.
Partager