Duda con Python: acceder a variables desde objetos.

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Duda con Python: acceder a variables desde objetos.

Notapor kaiser » Lun Nov 28, 2011 11:32 pm

Hola a todos, ando desarrollando un shooter espacial y me ha surgido una duda a la hora de crear el menú. Lo estoy haciendo mediante la técnica de escenas, es decir, un archivo inicial "ejecutar.py" que contiene el bloque de inicialización y el bucle principal. En el bucle compruebo el valor de la variable escena de la siguiente forma (pseudocódigo):

if escena == menu:
menu.update()
if escena == juego:
juego.update()
etc...

Obviamente desde el menú debo poder cambiar el valor de la variable "escena" de tal forma que si hago clic sobre la opción Jugar se inicie el juego, si hago clic sobre Ayuda se muestre una pantalla con instrucciones, etc. La variable "escena" está definida en el archivo "ejecutar.py" y "menú" es una clase definida en otro archivo. El tema está en que para que pueda realizar dicho cambio, "escena" debe ser una lista, inicializándola por ejemplo así: escena = ["menu"], y cada vez que quiera cambiar su valor debería hacerlo así: escena[0] = "juego". Si intento que escena sea de tipo String no me funciona, es decir, si inicializo escena así: escena = "menu", desde la clase menu no puedo hacer escena = "juego".

Así es como lo estoy haciendo ahora para que me funcione:
En el archivo "ejecutar.py" inicializo la variable escena como una lista y se la paso a la clase menu como parámetro
escena = ["menu"]
menu = menu.Menu(window, escena)

En el archivo menu.py pido la variable como parámetro y la convierto en local
class Menu:
def __init__(self, window, escena):
#Creamos las variables de control
self.window = window
self.escena = escena

Y para modificar su valor desde menu.py:
if clic_en_opcion_jugar:
self.escena[0] = "juego"

Obviamente clic_en_opcion_jugar es un método inventado para no poner la enorme línea de código que realmente va ahí.

He comprobado que si escena es de tipo string y al pasársela a menu.py la hago local con self.escena = escena, al cambiar el valor de self.escena, solo cambia el valor de self.escena pero no el de escena, es decir, es como si parámetro se hubiese pasado por valor en vez de por referencia. En cambio, si escena es de tipo lista, al cambiar el valor de self.escena cambia el valor de ambas variables como si se hubiese pasado por referencia.

Como he dicho, haciéndolo así (con una lista) me funciona, porque no puedo hacerlo usando por ejemplo un string?

Un saludo y gracias!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Duda con Python: acceder a variables desde objetos.

Notapor MrBB4 » Mar Nov 29, 2011 2:08 pm

Hola @kaiser.
Pues resulta que yo tambien estoy trabajando con el mismo sistema y la mejor solución es utilizar la metaclase Singleton(). Lo que singleton hace es que se pueda crear un solo objeto de cierta clase. Osea que sin importar cuantos objetos se creen en tu programa, con esta clase que tiene a singleton como metaclase, todos se referiran a un mismo objeto. Entonces lo que se hace es crear una clase Director() con la que deberás creará en todos tus scripts un objeto de esta clase, el cual será el mismo para todos los scripts. Dentro de este "Director()" se encontrarán las escenas y asunto resuelto. Ahora puedes llamar a las escenas desde cualquier parte de tu programa y pasar de una a otra sin problema.

La explicación y el desarrollo de como hacer esto lo encontrarás aquí. Este link fue prescentado al foro por @kiketom hace un tiempo en este post, y de hecho acabo de ver que al final del post nosotros dos hablamos por un momento. Debe ser que no te acuerdas de haberlo leido.

Espero te sirva.
Saludos y bendisiones.
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.

Re: Duda con Python: acceder a variables desde objetos.

Notapor kaiser » Mié Nov 30, 2011 7:47 am

Muchas gracias MrBB4, la verdad es que no me acordaba :oops:. Nunca he trabajado con metaclases así que miraré a ver como funciona eso y trataré de implementarlo. De todas formas me gustaría entender lo que pregunto arriba, porqué con una lista si puedo hacerlo y con un string no?

Un saludo!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Duda con Python: acceder a variables desde objetos.

Notapor MrBB4 » Mié Nov 30, 2011 2:35 pm

Jajaja sabia que se te había olvidado.
Pues si quieres, postèa el código y talves te pueda contestar lo de la lista y la string. La verdad nunca me habia cruzado con este problema, puede que si juego un rato con tu codigo entienda que está pasando.

Un saludo y suerte en todo ;)
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado