2010-06-18 7 views
6

Je lisais la documentation de Python à propos classes et suis tombé sur ce point que je ne suis pas sûr:Appel outrepassée Méthodes de classe dérivée de la classe de base

Les classes dérivées peuvent redéfinir les méthodes de leurs classes de base. Parce que les méthodes ont pas de privilèges spéciaux lorsque appeler d'autres méthodes du même objet , une méthode d'une classe de base qui appelle une autre méthode définie dans la même classe de base peut finir par appeler une méthode d'une classe dérivée qui overrides il. (Pour les programmeurs C++ toutes les méthodes en Python sont effectivement virtuelle.)

Exemple:

class A: 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print "from A" 

class B(A): 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print "from B" 

Est-ce que cela signifie qu'un objet de la classe A obj = A() peut se terminer en quelque sorte l'impression "de B" ? Est-ce que je lis ceci 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 dépassement. Merci!

Répondre

6

Non. La superclasse ne peut rien savoir de la sous-classe. Cela signifie que si vous instanciez la sous-classe B, et hérite d'une méthode foo(), et remplace une méthode bar(), alors quand vous appelez foo(), cela appellera la définition bar() dans B, pas la définition bar() dans A. Ce n'est pas ce que l'auteur de la superclasse prévu - il s'attendait à ce que son appel à bar() pour aller à sa propre définition.

0

Non, tout objet qui est un A invoquera A.bar et imprimer « from A »

Quelle méthode surchargé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 catégorie. Pensez à la classe comme un emporte-pièce, et l'objet comme le cookie.

+0

Pour se développer, le mot d'ordre est _may_ appeler une méthode d'une classe dérivée. 'obj = B()' _would_ imprime "de B". –

0

Pas exactement:

class A: 
    def foo(self): 
     self.bar() 

    def foo2(self): 
     self.bar2() 

    def bar(self): 
     print "Bar A" 

    def bar2(self): 
     print "Bar2 A" 

class B(A): 
    def bar(self): 
     print "Bar B" 

objA = A() 
objA.foo() 
objA.foo2() 

objB = B() 
objB.foo() 
objB.foo2() 

Sortie:

Bar A 
Bar2 A 
Bar B 
Bar2 A 
1

Non, cela signifie que si vous avez ci-dessous objet:

class B(A): 
    def bar(self): 
     print "from B" 

et vous faire

obj = B() 
obj.foo() 

alors ce imprimera from B comme foo(), qui est défini dans la classe de base , les appels bar(), qui est également définie dans la classe de base, mais substituée dans la classe dérivée.

Au moins, c'est ainsi que je l'ai lu.

1
a = A() 
a.foo() 
b = B() 
b.foo() 
a.bar = b.bar 
a.foo() 

sortie:

from A 
from B 
from B 
0

Ma réponse ne contredit pas nécessairement ceux affichés déjà, mais il montre un moyen d'obtenir la classe de base pour imprimer « de B » en appelant la classe de base méthode de la classe héritée. La classe de base appelle toujours la méthode de classe héritée car elle fonctionne à partir du self hérité. Peut-être est-ce le type de situation dont parle le paragraphe?

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
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 
Questions connexes