2010-06-18 12 views
6

que estaba leyendo la documentación de Python sobre classes y encontré este párrafo, que no estoy seguro acerca de:Llamar a Métodos anulado en clase derivada de la clase Base

clases derivadas pueden reemplazar los métodos de sus clases base. Dado que los métodos no tienen privilegios especiales cuando llamamiento otros métodos de la misma objeto, un método de una clase base que llama a otro método definido en la misma clase de base puede terminar llamar a un método de una clase derivada que anulaciones eso. (Para los programadores C++: todos los métodos en Python son efectivamente virtual.)

Ejemplo:

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" 

¿Quiere decir esto que un objeto de clase A obj = A() puede de alguna manera terminar la impresión "de B" ? ¿Estoy leyendo esto correctamente? Me disculpo si esto no tiene sentido. Estoy un poco confundido sobre cómo maneja Python Herencia y sobreescritura. ¡Gracias!

Respuesta

6

No. No hay forma de que la superclase sepa nada sobre la subclase. Lo que significa es si crea una instancia de la subclase B y hereda un método foo(), y anula un método bar(), luego cuando llama al foo(), que llamará a la definición bar() en B, no a la definición bar() en A. Esto no es lo el escritor de la superclase pretendía, esperaba que su llamada al bar() fuera a su propia definición.

0

No, cualquier objeto que es una A invocará A.bar e imprimir "from A"

Qué método reemplazado se llama depende de lo que el objeto es , no lo que otras clases pueden ser derivados de su clase. Piense en la clase como cortador de galletas y el objeto como la galleta.

+0

Para expandir, la palabra clave es _may_ llamar a un método de una clase derivada. 'obj = B()' _would_ print "from B". –

0

No exactamente:

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

Salida:

Bar A 
Bar2 A 
Bar B 
Bar2 A 
1

No, significa que si se dispone de los siguientes objetos:

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

y hacer

obj = B() 
obj.foo() 

entonces esto va a imprimir from B como foo(), que se define en la clase base de, las llamadas bar(), que también se define en la clase base, pero se reemplaza en la clase derivada.

Al menos así es como lo leí.

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

de salida:

from A 
from B 
from B 
0

Mi respuesta no necesariamente en contradicción con los ya publicados, pero sí muestra una manera de conseguir la clase base para imprimir "de B" llamando a la clase base método de la clase heredada. La clase base todavía llama al método de clase heredado, ya que funciona desde el yo heredado. Quizás este es el tipo de situación al que se refiere el párrafo?

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 
Cuestiones relacionadas