Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Relación entre clases POO

5 de septiembre de 2014

Supongamos que tengo estas dos clases:

class Linea():pass
 
class punto():pass
   def init(self,x,y)
       self.x=x
       self.y=y

Ahora tienen una relación de que una línea tiene dos puntos :

class Linea():
   def init(self, puntos):
       self.puntos=puntos
 
class Punto():
   def init(self,x,y,linea):
       self.x=x
       self.y=y
       self.linea=linea

Se añaden atributos para crear la relación, es decir, el atributo puntos puede ser una lista que contenga dos instancias de clase de la clase punto. Asimismo las instancias de clase de punto tendrán como atributo la instancia de clase de la clase linea.

Pero esto no se puede lograr ya que al momento de instanciar linea debo incluir los atributos de la clase punto como instancias de la clase punto y esta aún no se ha creado. ¿Cómo puedo solucionar este problema? Gracias.


Respuestas

#1

¿Y no podrías definir las clases de esta manera?

class Linea():
   def init(self, puntos):
       self.puntos=puntos
 
class Punto():
   def init(self, x, y):
       self.x=x
       self.y=y

Y utilizarlas así:

inicio = Punto(3, 2)
fin = Punto(9, 10)
linea = Linea([inicio, fin])

@javiereguiluz

5 septiembre 2014, 8:30
#2

Si, pero sólo linea contendría los puntos. Si yo quisiera ver a que línea pertencen los puntos, no lo podria hacer. Gracias por tu aporte pero me gustaria poder realizar esto que te digo.

@ing_edsan

5 septiembre 2014, 15:50
#3

Para conseguirlo sólo tendrías que modificar un poco el código original por lo siguiente:

class Linea():
   def init(self, puntos):
       self.puntos=puntos
 
class Punto():
   def init(self, x, y, linea=None):
       self.x=x
       self.y=y
       self.linea=linea

Ahora puedes usarlo de esta manera:

puntoInicial = Punto(3, 2)
puntoFinal = Punto(9, 10)
linea = Linea([puntoInicial, puntoFinal])
 
puntoInicial.linea = linea
puntoFinal.linea = linea

Y si muestras por pantalla algunas de estas propiedades, verás que está funcionando como quieres:

print linea              # <main.Linea instance at 0x10e8bacb0>
print puntoInicial.linea # <main.Linea instance at 0x10e8bacb0>
print puntoFinal.linea   # <main.Linea instance at 0x10e8bacb0>
 
print puntoInicial.linea.puntos[0].x  # muestra 3
print puntoInicial.linea.puntos[0].y  # muestra 2

@javiereguiluz

5 septiembre 2014, 16:15
#4

perfecto muchas gracias

@ing_edsan

8 octubre 2014, 1:16