Jetez un coup d'œil à ceci. Notez que la classe B
Remplacer A
's a()
méthode.
In [1]: class A(object):
...: def __init__(self):
...: self.a()
...: def a(self):
...: print "A.a()"
...:
...:
In [2]: class B(A):
...: def __init__(self):
...: super(B, self).__init__()
...: def a(self):
...: print "B.a()"
...:
...:
In [3]: b = B()
B.a()
Pas de surprise.
Maintenant, regardez ça. Notez que la méthode qui est maintenant surchargée est __a()
.
In [7]: class A(object):
...: def __init__(self):
...: self.__a()
...: def __a(self):
...: print "A.__a()"
...:
...:
In [8]: class B(A):
...: def __init__(self):
...: super(B, self).__init__()
...: def __a(self):
...: print "B.__a()"
...:
...:
In [9]: b = B()
A.__a()
Ce comportement m'a surpris.
Quelqu'un peut-il expliquer pourquoi A.__a()
est appelé à la place de B.__a()
?
Tout ce qui est __special__
à propos de __a
?
Mise à jour : Après avoir lu la réponse de Sean, j'ai voulu voir si je pouvais surcharger la méthode du nom mangé et j'ai obtenu ce résultat :
In [11]: class B(A):
....: def __init__(self):
....: super(B, self).__init__()
....: def _A__a(self):
....: print "B._A__a()"
....:
....:
In [12]: b = B()
B._A__a()