Foros del Web » Programando para Internet » Python »

Novato. Fallo usando distintas clases (Python 3)

Estas en el tema de Novato. Fallo usando distintas clases (Python 3) en el foro de Python en Foros del Web. Hola, estoy aprendiendo Python (3) por mi cuenta pero parece que me he atrancado un poco. He realizado programas simples de una sola clase y ...
  #1 (permalink)  
Antiguo 15/09/2010, 10:26
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Pregunta Novato. Fallo usando distintas clases (Python 3)

Hola, estoy aprendiendo Python (3) por mi cuenta pero parece que me he atrancado un poco.

He realizado programas simples de una sola clase y sin problema, pero al usar más de una clase tengo muchas dudas.

El primer problema gordo lo he tenido con los import, al tener varios ficheros cada uno con una clase (tengo 2 clases además del "main"), no me quería reconocer las clases nuevas y me daba fallos en el import todo el rato. Al final decidí dejar ese paso para cuando todo lo demás funcione, asi que he puestos las 3 clases en el mismo archivo para corregir los fallos que tenga e ir probando, como no son muy largas no es dificil.

Tras eso he tenido problemas con el "self". He acabado entendiendo que es como el "this" en java, solo que parece que hay que ponerlo siempre que te refieras a algún método/atributo de la clase en la que trabajas (en java solo se pone cuando hay varios atributos que se llaman igual o cuando haces referencia al objeto en el que estás). Si alguien me lo deja más claro lo agradecería.

Ahora mismo el problema que tengo es que cuando corro el programa no me ejecuta la mayoría de las cosas (no da error pero las variables se quedan a cero, los objetos no se crean...). No se que hacer ya, cuando lo ejecuto paso por paso escribiendolo (usando el shell), las cosas funcionan, pero cuando lo pongo en el programa y ejecuto nada funciona como debería.

¿Quien me ayuda? Lo más seguro es que los errores sean muy tontos, por ser novato y tal. Solo necesito a alguien que me clarifique un poco las cosas. Os dejo el código que estoy usando, es un juego del bingo MUY CUTRE. Se le podrían modificar mil cosas, pero solo quiero probar lo de las clases.

En resumen, estoy creando 3 clases: Bombo, Tablero y el main que se llama Bingo. En el bombo están las bolas que van saliendo, el tablero son los numeros que tu juegas (se juega contra el ordenador) y el main solo va llamando a un par de cosas.

Código:
#Filename: bombo.py
import random

class Bombo:
    largo=0
    lista_bolas=[True,]


    def __init__(self, n):
        for i in range(n-1):
            self.lista_bolas.append(True)
        self.largo=n


    def total_bolas(self):
        j=0
        for i in range(self.largo):
            if(self.lista_bolas[i]==True):
                j+=1
        return j


    def saca_bola(self):
        alea=0
        while(self.lista_bolas[alea]==False):
            alea=int(random.random()*largo)
            if(self.lista_bolas[alea]==True):
                self.lista_bolas[alea].append(False)
                return alea
        return alea


    def mete_bola(self, n):
        self.lista_bolas[n]=True


    def quedan_bolas(self):
        for i in range(self.largo):
            if (self.lista_bolas[i]==True):
                return True
        return False









#Filename: tablero.py

class Tablero:
    sw=0
    lista_tablero=[[],[],[]]
    filas=0
    columnas=0


    def __init__(self, f, c, bolas):
        self.filas=f-1
        self.columnas=c-1
        bombo = Bombo(bolas)
        for i in range (f-1):
            for j in range (c-1):
                self.lista_tablero[i].append(bombo.saca_bola())

                
    def pintar_tablero(self):
        for i in range (self.filas):
            self.lista_tablero[i]


    def buscar_valor(self, n):
        for i in range (self.filas):
            for j in range (self.columnas):
                if (self.lista_tablero[i][j] == n):
                    self.lista_tablero[i][j] = 0


    def linea(self):
        for i in range (self.filas):
            cont = 0
            for j in range (self.columnas):
                if (self.lista_tablero[i][j] == 0):
                    cont += 1
                    if (cont == self.columnas):
                        print ("Canto linea")
                        return True
        return False


    def bingo(self):
        for i in range (self.filas):
            for j in range (self.columnas):
                if (self.lista_tablero[i][j]!=0):
                    return False
        print ("El juego acabó, se ha cantado bingo")
        return True



#Filename: bingo.py
#Realmente es el main.
class Bingo:
    bola = 0
    cont = 1
    fin = False
    tablero_h = Tablero(3, 5, 90)
    tablero_c = Tablero(3, 5, 90)
    bombi = Bombo(90)
    print ("Bienvenido al juego del bingo")
    print ("Este es su tablero:")
    tablero_h.pintar_tablero()
    print ("Este es el tablero de la CPU:")
    tablero_c.pintar_tablero()
    while (bombi.quedan_bolas() == True and fin == False ):
        print ("Turno ", cont)
        cont += 1
        print ("Sacando una bola")
        bola = bombi.saca_bola()
        print ("Ha salido la bola ", bola)
        tablero_h.buscar_valor (bola)
        print ("Su tablero ha quedado asi:")
        tablero_h.pintar_tablero()
        tablero_c.buscar_valor (bola)
        print ("El tablero de la CPU ha quedado asi:")
        tablero_c.pintar_tablero()
        if (tablero_c.bingo() == True or tablero_h.bingo() == True):
                fin = True
De verdad, no pretendo molestar ni que me lo expliquen todo, pero creo que estoy un poco perdido cuando salgo de Java. A ver si alguien puede echarme un cable, creo que podría gustarme Python (aunque el autocompletar de IDLE sea tan feo jaja).

Antes de nada, gracias.
  #2 (permalink)  
Antiguo 15/09/2010, 10:38
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 9 años, 7 meses
Puntos: 71
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Revisa como declarar atributos en una clase en python ahí esta tu error, no es como en java.
  #3 (permalink)  
Antiguo 15/09/2010, 10:51
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 7 meses
Puntos: 1360
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Algunas observaciones como comentarios en el código.

Código Python:
Ver original
  1. #Filename: bombo.py
  2. import random
  3.  
  4. class Bombo:
  5.     largo=0
  6.     lista_bolas=[True,]
  7.  
  8.  
  9.     def __init__(self, n):
  10.         for i in range(n-1):
  11.             self.lista_bolas.append(True)
  12.         self.largo=n
  13.  
  14.  
  15.     def total_bolas(self):
  16.         j=0
  17.         for i in range(self.largo):
  18.             if(self.lista_bolas[i]==True):
  19.                 j+=1
  20.         return j
  21.  
  22.  
  23.     def saca_bola(self):
  24.         alea=0
  25.         while(self.lista_bolas[alea]==False):#Aqui nunca entra
  26.             alea=int(random.random()*largo)
  27.             if(self.lista_bolas[alea]==True):
  28.                 self.lista_bolas[alea].append(False)
  29.                 return alea
  30.         return alea #Siempre regresa 0
  31.  
  32.  
  33.     def mete_bola(self, n):
  34.         self.lista_bolas[n]=True
  35.  
  36.  
  37.     def quedan_bolas(self):
  38.         for i in range(self.largo):
  39.             if (self.lista_bolas[i]==True):
  40.                 return True
  41.         return False
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51. #Filename: tablero.py
  52.  
  53. class Tablero:
  54.     sw=0
  55.     lista_tablero=[[],[],[]]
  56.     filas=0
  57.     columnas=0
  58.  
  59.  
  60.     def __init__(self, f, c, bolas):
  61.         self.filas=f-1
  62.         self.columnas=c-1
  63.         bombo = Bombo(bolas)
  64.         for i in range (f-1):
  65.             for j in range (c-1):
  66.                 self.lista_tablero[i].append(bombo.saca_bola())
  67.  
  68.                
  69.     def pintar_tablero(self):
  70.         for i in range (self.filas):
  71.             print(self.lista_tablero[i]) #Aqui falta un print
  72.  
  73.  
  74.     def buscar_valor(self, n):
  75.         for i in range (self.filas):
  76.             for j in range (self.columnas):
  77.                 if (self.lista_tablero[i][j] == n):
  78.                     self.lista_tablero[i][j] = 0
  79.  
  80.  
  81.     def linea(self):
  82.         for i in range (self.filas):
  83.             cont = 0
  84.             for j in range (self.columnas):
  85.                 if (self.lista_tablero[i][j] == 0):
  86.                     cont += 1
  87.                     if (cont == self.columnas):
  88.                         print ("Canto linea")
  89.                         return True
  90.         return False
  91.  
  92.  
  93.     def bingo(self):
  94.         for i in range (self.filas):
  95.             for j in range (self.columnas):
  96.                 if (self.lista_tablero[i][j]!=0):
  97.                     return False
  98.         print ("El juego acabó, se ha cantado bingo")
  99.         return True
  100.  
  101.  
  102.  
  103. #Filename: bingo.py
  104. #Realmente es el main.
  105. class Bingo:
  106.     bola = 0
  107.     cont = 1
  108.     fin = False
  109.     tablero_h = Tablero(3, 5, 90)
  110.     tablero_c = Tablero(3, 5, 90)
  111.     bombi = Bombo(90)
  112.     print ("Bienvenido al juego del bingo")
  113.     print ("Este es su tablero:")
  114.     tablero_h.pintar_tablero()
  115.     print ("Este es el tablero de la CPU:")
  116.     tablero_c.pintar_tablero()
  117.     while (bombi.quedan_bolas() == True and fin == False ):
  118.         print ("Turno ", cont)
  119.         cont += 1
  120.         print ("Sacando una bola")
  121.         bola = bombi.saca_bola() #Aqui siempre regresa 0
  122.         print ("Ha salido la bola ", bola)
  123.         tablero_h.buscar_valor (bola)
  124.         print ("Su tablero ha quedado asi:")
  125.         tablero_h.pintar_tablero()
  126.         tablero_c.buscar_valor (bola)
  127.         print ("El tablero de la CPU ha quedado asi:")
  128.         tablero_c.pintar_tablero()
  129.         if (tablero_c.bingo() == True or tablero_h.bingo() == True): #Truena al primer intento
  130.                 fin = True #Por si fuera poco no dice quien gana
  131.  
  132. Bingo()

Definitivamente tiene un estilo muuuy javero, es mas que nada problema de lógica no de sintaxis.

Con los imports ten cuidado esto no es como en java que no sabes que es lo que tienes en tu namespace, aquí todo esta bien controlado.

Por ejemplo para importar una clase de un archivo haces un:
Código Python:
Ver original
  1. from mi_modulo import mi_clase
Recuerda que modulo = archivo y paquete = carpeta.

Si mi modulo se llama tablero.py y mi clase se llama Tablero
Entonces hago un
Código Python:
Ver original
  1. from tablero import Tablero
  #4 (permalink)  
Antiguo 15/09/2010, 11:25
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Hola, lo de que la función de sacar bola daba cero ya me dí cuenta pero aún no me he puesto a corregirla. Aún asi muchas gracias por señalarlo, está claro que se nota mucho jajaja. También la caga al terminar, ni se sabe quien gana ni continúa sacando bolas, tengo que arreglarlo :P

Sobre lo demás pues creo que entiendo mejor los imports. Hoy ya no me queda tiempo, pero cuando vuelva del curro esta noche lo probaré a ver que tal.

Por otro lado, no se si he usado bien los "self". Si no los pongo en los métodos me da fallo al llamarlos, asi que supongo que debo ponerlos obligatoriamente. Sin embargo, no se si se debe usar el "self" antes de cada llamada a método o atributo de la clase en la que se está trabajando (me parece un poco extraño ese abuso de "self").

De verdad, muchísimas gracias por todo.
  #5 (permalink)  
Antiguo 15/09/2010, 16:29
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 7 meses
Puntos: 1360
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Al contrario a mi me parece abusivo de parte de java que no tenga un self.

Si el uso del self, los parámetros, variables locales, variables globales, miembros de clase todo se puede confundir mas fácilmente.

PD: Puedes usar self o le puedes llamar, this self es meramente una convención de nombres.
  #6 (permalink)  
Antiguo 15/09/2010, 17:18
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Hombre, java tiene su this, pero únicamente es obligatorio cuando hay variables con el mismo nombre y cosas asi. La declaracion de variables y tal es diferente.

Bueno, muchas gracias a todos. CapacProg me ha ayudado a ver un error muy grande que tenía al declarar variables. Parece ser que Python te permite hacer cosas como modificar constantes sin avisarte ni nada (que no es que sea inutil, pero un poco raro si que es, por eso se llamaban constantes jaja). Ahora entiendo mejor el uso del self y dónde declarar cada cosa.

El programa me funciona a la perfección, lo separé de nuevo en archivos diferentes y conseguí usar correctamente el import gracias a la clara explicación de razpeitia.

En fin, he aprendido mucho con este cutre jueguecito, al final ha quedado igual de cutre pero funciona, osea que objetivo cumplido.

Por cierto, es un poco jodido esto de que Python no tenga do-while ni un switch. Lo del do-while lo eché en falta incluso en este programita tonto, el switch... ya me hará falta, no tardará mucho... ¿Cómo lo haceis?

Da gusto encontrar gente dispuesta a ayudar. De nuevo gracias.
  #7 (permalink)  
Antiguo 15/09/2010, 18:22
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 7 meses
Puntos: 1360
Respuesta: Novato. Fallo usando distintas clases (Python 3)

El switch lo puedes hacer con de 2 maneras:
1.- Con if ... elif ... else (Principiante)
2.- Con un diccionario de funciones (Avanzado)

Código Python:
Ver original
  1. op = input("Dame un opcion [A B C]: ")
  2. if(op == 'A'):
  3.     do_something
  4. elif(op == 'B'):
  5.     do_something_else
  6. elif(op == 'C'):
  7.     do_something_more
  8. else:
  9.     do_default

El diccionario de funciones es mas rápido que hacer ifs anidados. Pero no mostrare, ha menos que lo pidan.
  #8 (permalink)  
Antiguo 16/09/2010, 00:34
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Ok, creo que con eso tengo hasta que vaya a controlar muchos valores y respuestas distintas.

Mmmm... no se si ponerme a hacer algún programa con GUI (PyQT, PyGTK, wx, twinker...) o seguir haciendo cosas por consola. En todo caso, para que la GUI de python sea multiplataforma ¿qué usais? Me habían recomendado GTK, pero hay quien dice que luego es un poco coñazo porque tiene ciertos cambios entre windows-linux...
  #9 (permalink)  
Antiguo 16/09/2010, 11:23
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 7 meses
Puntos: 1360
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Te recomiendo wxpython, lo he probado en windows y linux y funciona de maravilla.

Bastante portable, ademas de tener look&feel
  #10 (permalink)  
Antiguo 17/09/2010, 00:22
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Novato. Fallo usando distintas clases (Python 3)

A ver si me pongo y lo pruebo, ahora estoy más liado :P

Muchas gracias. Buscaré tutoriales de wxpython y algún IDE que me ayude con ello.

Un saludo.
  #11 (permalink)  
Antiguo 17/09/2010, 02:30
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Vale, por lo visto wxpython no va con python 3. Parece que funciona bien en multiplataforma y que hay buena info en internet, pero no me gustaría irme a python 2.6/2.7 (ya que he empezado con python 3 y que la gente de python recomienda irse pasando...).

¿Puede ser que esté equivocado y haya versión para python 3? Ahora ya creo que me iré a por algún otro que prometa también ser multiplataforma :P
  #12 (permalink)  
Antiguo 17/09/2010, 14:24
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 7 meses
Puntos: 1360
Respuesta: Novato. Fallo usando distintas clases (Python 3)

La verdad te recomendaría aprender con python 2.6 o 2.7 y de hay dar el paso para python 3.x es mucho mas sencillo. Ademas de que muchos módulos no están portados aún. Sin mencionar que es mucho mas estable. Ciertamente me pasaría a python 3.x pero todavía falta que madure.
  #13 (permalink)  
Antiguo 18/09/2010, 03:39
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Novato. Fallo usando distintas clases (Python 3)

No se, me molestaría un poco ir ahora a Python 2.6/2.7 jaja pero la verdad es que en módulos le da 20 vueltas a Python 3... no se por qué recomiendan encarecidamente pasar a Python 3 cuando hay tan pocos módulos portados.

Tendré que instalar y aprender Python 3 e instalar wxpython. ¿Qué IDE debería usar para crear la interfaz gráfica? ¿IDLE va bién para ello? (ya se que no va a ser como netbeans :P)
  #14 (permalink)  
Antiguo 18/09/2010, 11:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 7 meses
Puntos: 1360
Respuesta: Novato. Fallo usando distintas clases (Python 3)

wxglade o wxformbuilder (este ultimo solo tiene soporte para python en su versión beta).

Aunque puedes generar archivos "tipo xml" pero con detalles de la interfaz algo así como los wpf y cargar el archivo con python generar interfaz, etc...

En python no lo he hecho pero si lo hago te cuento como me fue.

Edito: Ya me acorde son archivos xrc

Última edición por razpeitia; 19/09/2010 a las 10:18
  #15 (permalink)  
Antiguo 19/09/2010, 07:41
 
Fecha de Ingreso: septiembre-2010
Mensajes: 8
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Novato. Fallo usando distintas clases (Python 3)

Sería curiosos probar... de momento creo que me toca instalar python 2.6/2.7 y wxglade. Intentaré aprender a hacer las GUI sin molestar mucho, pero estoy viendo que cambia mucho a como las hacía en Java jaja.

Un saludo y muchas gracias de nuevo, estoy seguro de que volveremos a hablar por aquí pronto ^^.

Etiquetas: clases, distintas, fallo
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:22.