2012-02-03 65 views

Respuesta

2

Esta es una pregunta muy amplia. Como usted no proporciona código de ejemplo, sólo voy a mostrar el ejemplo más sencillo:

class A(object): 
    def meth1(self, a): 
     self.meth2(a, a*a) 

class B(A): 
    def meth2(self, a, b): 
     return b/a 

b = B() 
b.meth1(10) 
+0

¿De dónde viene 'a'? Donde el metodo 'meth'? –

+1

@Tichodroma Lo siento, mi culpa. Debería pensar mientras escribes ;-) Corregido ahora. – glglgl

+0

¿Qué pasa si las clases están en módulos separados? es decir file2.py importación archivo1 clase TestCase (file1.TestBase): ejecutar def (self): self.pass() file1.py clase TestBase: pase def (auto): print "PASS" testBase = TestBase() testBase.execute() – ThePracticalOne

9

El punto detrás de una subclase es que se extiende y altera el comportamiento de la superclase. La superclase no puede saber cómo una subclase lo extenderá.

Editar: Pero es también posible que la superclase sabe, que la subclase la ampliará. No estoy seguro, si esto es un buen diseño, sin embargo.

0

Aquí es lo que acabo he intentado:

class A(object): 
    def x(self): 
     print self.y() 

class B(A): 
    def y(self): 
     return 1 

>>> B().x() 
1 

Así que a menos que tuviera algún problema específico, simplemente llamar a un método de la subclase en la clase base y que sólo debería funcionar.

+1

Me pregunto por qué alguien quiere hacer esto. ¿Por qué quiero escribir 'A' de una manera que sepa de antemano cómo' B' lo extenderá? –

+1

@Tichodroma: Sí, aquí huele a código. Pero tal vez es, por ejemplo, el conferencista de OP que no está sincronizado con la realidad;)? –

+4

@Tichodroma tal vez no lo sepas? Deje que 'A' sea una clase base que se puede extender en, digamos, 3 o 4 formas. No sabe cómo se implementan, solo qué firma proporcionan. He visto tales cosas a menudo, p. en 'MySQLdb'. – glglgl

0

Creo que esto está relacionado con el uso de métodos abstractos. La clase principal define los métodos que la subclase debe implementar y la clase principal sabe que estos métodos se implementarán. Existen estructuras similares, por ejemplo, en Java.

El uso de estos en Python se discute aquí también: Abstract methods in Python

7

Creo que este es un patrón de uso frecuente.

class A(object): 
    def x(self): 
     self.y() 

    def y(self): 
     print('default behavior') 


class B(A): 
    def y(self): 
     print('Child B behavior') 

class C(A): 
    def z(self): 
     pass 

>>>B().x() 
Child B behavior 
>>>C().x() 
default behavior 

Es algo así como una clase abstracta, pero proporciona un comportamiento predeterminado. Sin embargo, no recuerdo el nombre del patrón en la parte superior de mi cabeza.

+0

Usando la terminología de C++ sería simplemente polimorfismo. Pero con Python eso es verdad para todo ... – matsjoyce

Cuestiones relacionadas