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
¿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
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
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
perfecto muchas gracias
@ing_edsan