8
votes

Appeler des méthodes remplacées dans la classe dérivée de la classe de base

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.)

Exemple: xxx

Cela signifie-t-il qu'un objet de classe A obj = a () 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!


0 commentaires

7 Réponses :


0
votes

Non, aucun objet qui est un A invoquera A.bar et imprimer " à partir d'un " "

Quelle méthode remplacée est appelée dépend de ce que l'objet est , 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.


1 commentaires

Pour développer, le mot opérationnel est peut appeler une méthode de classe dérivée. obj = b () serait imprimer "de b".



8
votes

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 () et remplace une méthode bar () , puis lorsque vous appelez foo () , qui appellera la référence () de la définition de B, pas de la barre () Définition dans A. Ce n'est pas ce que l'auteur de la superclasse prévu - Il s'attendait à son appel à Bar () Pour aller à sa propre définition.


1 commentaires

Comment empêcher que cela se produise?



0
votes

pas exactement: xxx

sortie: xxx


0 commentaires

1
votes

Non, cela signifie que vous si vous avez l'objet suivant: xxx

et vous faites xxx

alors cela imprimera de b comme foo () , qui est défini dans la classe de base , appels bar () , qui est également défini. Dans la classe de base, mais remplacé dans la classe dérivée .

au moins c'est comme ça que je le lis.


0 commentaires

2
votes
from A
from B
from B

0 commentaires

1
votes

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


0 commentaires

0
votes
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

0 commentaires