Foros del Web » Programando para Internet » Python »

[PyGTK] Interacción entre clases

Estas en el tema de [PyGTK] Interacción entre clases en el foro de Python en Foros del Web. Hola a todos. ¿Cómo puedo acceder a una variable que está en una clase desde otra(s) clase(s)? Por ejemplo si tengo @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Python: ...
  #1 (permalink)  
Antiguo 19/09/2011, 14:13
 
Fecha de Ingreso: septiembre-2010
Mensajes: 525
Antigüedad: 13 años, 6 meses
Puntos: 59
[PyGTK] Interacción entre clases

Hola a todos. ¿Cómo puedo acceder a una variable que está en una clase desde otra(s) clase(s)?

Por ejemplo si tengo
Código Python:
Ver original
  1. class Main:
  2.     def quit(self,arg):
  3.         gtk.main_quit()
  4.  
  5.     def __init__(self):
  6.         self.main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  7.         self.main_window.connect("destroy",self.quit)
  8.        
  9.         self.label = gtk.Label("ejemplo")
  10.        
  11.         cambia_texto_label().cambiar()
  12.        
  13.         self.main_window.add(self.label)
  14.         self.main_window.show_all()
  15.  
  16.     def main(self):
  17.         gtk.main()
  18.  
  19. class cambia_texto_label(Main):
  20.     def cambiar(self):
  21.         self.label.set_label("Texto cambiado")

Me da este error:
Código error:
Ver original
  1. RuntimeError: maximum recursion depth exceeded

Entra en recursión, entonces, ¿cuál es la solución?

Gracias
  #2 (permalink)  
Antiguo 19/09/2011, 14:47
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: [PyGTK] Interacción entre clases

En la linea 11 entra en recursión.

La respuesta es simple, debes de diseñar bien tus clases.

Por ejemplo crear una clase Ventana.
Código Python:
Ver original
  1. import gtk
  2.  
  3. class Frame:
  4.     def __init__(self):
  5.         self.main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  6.         self.main_window.connect("destroy", gtk.main_quit)
  7.        
  8.         self.text = "ejemplo"
  9.         self.label = gtk.Label(self.text)
  10.         self.main_window.add(self.label)
  11.         self.main_window.show_all()
  12.  
  13.     def cambiar_texto(self, text):
  14.         self.text = text
  15.         self.label.set_text(self.text)
  16.        
  17. ventana1 = Frame()
  18. ventana1.cambiar_texto("Hola")
  19. gtk.main()
  #3 (permalink)  
Antiguo 19/09/2011, 15:07
 
Fecha de Ingreso: septiembre-2010
Mensajes: 525
Antigüedad: 13 años, 6 meses
Puntos: 59
Gracias por la respuesta, pero creo que no me has entendido bien. El problema es que la función cambiar_texto está en otra clase, no en la clase Frame.

__________________
01011111 01000001 01100100 01110010 01101001 01100001 01101110 01011111
  #4 (permalink)  
Antiguo 19/09/2011, 15:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: [PyGTK] Interacción entre clases

Claro que te he entendido de hecho lo entiendo y comprendo muy bien.

El problema es que no un simple "haz esto y ya". Si no que el error es de diseño probablemente derivado por el mal conocimiento de Programación Orientada a Objetos (POO). Ya que rompes con los principios de S.O.L.I.D

El punto es que no necesitas crear otra clase (y mucho menos usar herencia) solo para cambiar el texto de un label.
  #5 (permalink)  
Antiguo 19/09/2011, 19:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 525
Antigüedad: 13 años, 6 meses
Puntos: 59
Sé que no necesito otra clase sólo para cambiar el texto , eso era sólo un ejemplo. En realidad tengo un módulo externo, y desde ese módulo quiero cambiar unas variables que están en el archivo principal.

__________________
01011111 01000001 01100100 01110010 01101001 01100001 01101110 01011111
  #6 (permalink)  
Antiguo 21/09/2011, 17:39
 
Fecha de Ingreso: septiembre-2010
Mensajes: 525
Antigüedad: 13 años, 6 meses
Puntos: 59
¿Es posible hacer esto? ¿Alguna ayuda por favor?

__________________
01011111 01000001 01100100 01110010 01101001 01100001 01101110 01011111
  #7 (permalink)  
Antiguo 21/09/2011, 18:59
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: [PyGTK] Interacción entre clases

Ok para referencias futuras.

Si tienes un programa separado en módulos o/y paquetes y tienen una cierta jerarquía. Entonces respeta la jerarquía, los módulos solo deben de hacer uso de otros módulos y nada mas.

Por ejemplo cuando estoy usando el modulo os o sys, no los modifico solamente los uso.
No le cambio el valor de sys.stdin por el de otro archivo. O cuando estoy usando os.walk no voy y me meto a las variables de esa función.

Si necesitas obtener datos entonces crea una función que te devuelva esos datos o bien que estén dentro.

Si quieres acceder a variables que esten dentro de un modulo y que sean "constantes" entonces puedes hacer lo siguiente:
Código Python:
Ver original
  1. #A.py
  2. a = 1
  3. b = 2

Código Python:
Ver original
  1. #B.py
  2. import A
  3. print A.a
  4. print A.b
  #8 (permalink)  
Antiguo 24/09/2011, 12:58
 
Fecha de Ingreso: septiembre-2010
Mensajes: 525
Antigüedad: 13 años, 6 meses
Puntos: 59
Bueno muchas gracias por la respuesta, pero no has respondido a mi pregunta: ¿es posible hacer lo que digo en el primer post o no?

__________________
01011111 01000001 01100100 01110010 01101001 01100001 01101110 01011111
  #9 (permalink)  
Antiguo 24/09/2011, 15:52
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: [PyGTK] Interacción entre clases

Cita:
Iniciado por _Adrian_ Ver Mensaje
¿Cómo puedo acceder a una variable que está en una clase desde otra(s) clase(s)?
No puedes a menos que sea una variable estática.
  #10 (permalink)  
Antiguo 24/09/2011, 17:07
 
Fecha de Ingreso: septiembre-2010
Mensajes: 525
Antigüedad: 13 años, 6 meses
Puntos: 59
Muchas gracias.

__________________
01011111 01000001 01100100 01110010 01101001 01100001 01101110 01011111

Etiquetas: clases, interacción, pygtk
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:30.