Je lisais les docs Python sur classes et rencontré ce paragraphe que je ' Je ne suis pas sûr de:
Les classes dérivées peuvent remplacer les méthodes de leurs classes de base. Parce que les méthodes n'ont pas de privilèges spéciaux quand appeler d'autres méthodes de la même objet, une méthode d'une classe de base qui appelle une autre méthode définie dans le même classe de base peut finir par appeler un méthode de classe dérivée qui le remplace. (Pour les programmeurs C ++: Toutes les méthodes de python sont efficacement virtuel.) p> blockquote>
Exemple: p>
xxx pré> Cela signifie-t-il qu'un objet de classe A
obj = a () code> peut en quelque sorte finaliser l'impression "de b"? Est-ce que je lis ça correctement? Je m'excuse si cela n'a pas de sens. Je suis un peu confus quant à la façon dont Python gère l'héritage et le remplacement. Merci! P> p>
7 Réponses :
Non, aucun objet qui est un Quelle méthode remplacée est appelée dépend de ce que l'objet est em>, pas ce que les autres classes peuvent être dérivées de sa classe. Pensez à la classe comme un coiffeur, et l'objet en tant que cookie. P> A code> invoquera A.bar code> et imprimer " à partir d'un code>" p> "
Pour développer, le mot opérationnel est peut i> appeler une méthode de classe dérivée. obj = b () code> serait i> imprimer "de b".
Non. Il n'y a aucun moyen que la superclasse ne puisse rien savoir sur la sous-classe. Ce que cela signifie, c'est si vous instanciez la sous-classe B, et il hérite d'une méthode foo () code> et remplace une méthode bar () code>, puis lorsque vous appelez foo () code>, qui appellera la référence () code> de la définition de B, pas de la barre () code> Définition dans A. Ce n'est pas ce que l'auteur de la superclasse prévu - Il s'attendait à son appel à Bar () Code> Pour aller à sa propre définition. P>
Comment empêcher que cela se produise?
pas exactement: sortie: p>
Non, cela signifie que vous si vous avez l'objet suivant: et vous faites p> alors cela imprimera au moins c'est comme ça que je le lis. p> p> de b code> comme foo () code>, qui est défini dans la classe de base forte>, appels bar () code>, qui est également défini. Dans la classe de base, mais
from A from B from B
Ma réponse ne contredit pas nécessairement ceux qui ont déjà publié, mais il montre un moyen d'obtenir la classe de base à imprimer "de B" en appelant la méthode de la classe de base à partir de la classe héritée. La classe de base appelle toujours la méthode de classe héritée car elle fonctionne de soi héritée. C'est peut-être le type de situation que le paragraphe fait référence?
class A:
def foo(self):
self.bar()
def bar(self):
print("from A")
class B(A):
def foo(self):
super().foo()
def bar(self):
print("from B")
A().foo() #prints "from A"
B().foo() #prints "from B" but indirectly through the base class
class A:
def f(self):
print 'a.f'
self.g()
def g(self):
print 'a.g'
class B(A):
def g(self):
print 'b.g'
b = B()
b.f()
# a.f
# b.g