Duda programación (POO)

M

Hola,

Estoy empezando con Kivy ("Kivy - Open source library for rapid development of applications that make use of innovative user interfaces, such as multi-touch apps." ) y siguiendo su tutorial hay una cosa que no entiendo.

Creo que la duda es de programación orientada a objetos y no específica de Kivy. El lenguaje empleado es Python. Bueno al grano: (el siguiente codigo hace referencia a este paso del tutorial)

class PongBall(Widget):
    velocity_x = NumericProperty(1)
    velocity_y = NumericProperty(0)
    velocity = ReferenceListProperty(velocity_x, velocity_y)
    
def move(self): self.pos = Vector(*self.velocity) + self.pos class PongGame(Widget): ball = ObjectProperty(None) def serve_ball(self): self.ball.center = self.center self.ball.velocity = Vector(4,0).rotate(randint(0,360)) def update(self, dt): self.ball.move() #bounce off top and bottom if (self.ball.y < 0) or (self.ball.top > self.height): self.ball.velocity_y *= -1 #bounce off left and right if (self.ball.x < 0) or (self.ball.right > self.width): self.ball.velocity_x *= -1

Mi duda es la siguiente:

  • ¿Por qué puede hacer "self.ball.move()" dentro de la clase "PongGame" si el procedimiento "move()" está dentro la clase "PongBall"? ¿Como los conecta? ¿No se supone que hay "encapsulamiento"?
B

Porque ball es un PongBall o algo similar, que se puede mover (no controlo Python, y como no se declaran los tipos no estoy seguro).

Nucklear

Porque en PongGame crea el objeto ball que tendrá el método move en el, o eso creo entender.

1 1 respuesta
M

#3 ¿Entonces el método que define en la linea 6 con nombre "move()" que función tiene? (desde la ignorancía)

1 respuesta
BLZKZ

#4 cambiar la posicion de ball.

Si te fijas ball tiene velocidad_X (en el eje X), velocidad_Y y velocidad, ademas de centro. move() lo que hace es calcular la posición siguiente (X,Y) apartir de la actual imagino dependiendo de las 3 velocidades y del centro.

1 respuesta
M

#5 Pues formulo la pregunta al revés... xD
¿Como puede cambiar la posición de "ball" si es un objeto de la otra clase?

1 respuesta
BLZKZ

#6 el no la cambia, eso es precisamente oo, delegar. Él le dice a ball que ejecute su método move con los datos que le pasa.

Aún así por lo que veo ball tiene atributos públicos que pueden cambiarse desde cualquier sitio :)

cabron

Tu duda es algo específico de este framework que estás usando:

ball = ObjectProperty(None)

ball es una instancia de la clase ObjectProperty que es una clase de ese framework: http://kivy.org/docs/api-kivy.properties.html

En el enlace al tutorial que has puesto, pone que para que funcione en un archivo tienes que declarar esto:

<PongGame>:
ball: pong_ball

# ... (canvas and Labels)

PongBall:
    id: pong_ball
    center: self.parent.center

Vamos que no es python estándar ni uso de la herencia de forma normal.

M

Para finalizar y entenderlo del todo....

Si fuera POO convencional, una instancia de una clase cualquiera, creada dentro de la clase A, ¿sería visible desde una clase B?

Es decir, ¿este código tendría sentido dentro la POO convencional?

1 respuesta
cabron

Depende

ClaseA:

MiembroPublico ClaseC c

ClaseB:
MiembroPrivado ClaseaA a
a.c.metodoClaseC()

Eso se podría hacer debido a c es público dentro de la clase A, pero esto está considerado mala práctica, lo normal es que c fuese un miembro privado, con lo cual no se podría.

1 respuesta
BLZKZ

#9 Sí, se puede hacer.

Ejemplo:

public class A {

  public int c;

  A(){c = 0;}
  public void actualiza()
  {
    c++;
  }
}

public class B {
  private A atributo;
  void algo()
  {
     atributo.c = 2;
     atributo.actualiza();
  }
Dorenz

Sin entender Python, si tienes una clase con un cierto método implementado y declaras un objeto de dicha clase en otra diferente no veo porque no deberías poder usar sus métodos en esta última.

Edito. Es lo mismo que te ha dicho #10, sólo que él lo ha explicado mejor, lol esto me pasa por no leer antes de postear.

M

Creo que lo he entendido. Muchas gracias a todos, cuando me haga rico haciendo videojuegos me acordaré de vosotros

Usuarios habituales