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:
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)
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
parent.numberOfInstance += 1 que je commente le résultat devient
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
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
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.