Autor Tema: Dudas (varias) con la POO en python.  (Leído 5552 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Dudas (varias) con la POO en python.
« en: 15 de Julio de 2022, 10:32:21 »
Hola Picuino, hola a todos, ¿ cómo están?, bien como lo dice el enunciado
tengo varias dudas con el código que expongo a continuación.-
No tengo errores, pero como estoy en un inicio del estudio de la POO lo
que necesito es que me digan que debo modificar o que estoy haciendo
mal o innecesario.-

Código: Python
  1. class Productos:
  2.     def __init__(self, codigo, nombre, precio):
  3.         self.codigo = codigo
  4.         self.nombre = nombre
  5.         self.precio = precio
  6.  
  7.     def grabar(self, codigo, nombre, precio, lista):
  8.         final = f"{codigo}, {nombre}, {precio}"
  9.         lista.append(final)
  10.  
  11.     def ingreso(self):
  12.         lisProducto = []
  13.         fin = True
  14.  
  15.         while fin:
  16.             codigo = input("Código..........: ")
  17.             nombre = input("Descripcion.....: ")
  18.             precio = input("Precio..........: ")
  19.        
  20.             self.grabar(codigo, nombre, precio, lisProducto)
  21.  
  22.             siNo = input('"Si" para continuar "No" para finalizar...: ')
  23.             if siNo == 'No':
  24.                 fin = False
  25.        
  26.         self.imprimir(lisProducto)
  27.  
  28.     def imprimir(self, lista):
  29.         print("\n ======================================= ")
  30.         print("\n Código  Producto               Precio")
  31.  
  32. def main():
  33.     producto = Productos(codigo=0, nombre="", precio=0.00)
  34.     producto.ingreso()
  35.  
  36. if __name__ == '__main__':
  37.     main()

Desde ya muchas gracias por el tiempo que le dediquen.-
Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Dudas (varias) con la POO en python.
« Respuesta #1 en: 15 de Julio de 2022, 11:34:32 »
Lo primero que te diría es que una clase es un conjunto de VARIABLES + FUNCIONES. Ambos funcionan juntos y normalmente las variables no son accesibles directamente desde el exterior de la clase, se tiene que acceder a ellas mediante funciones llamadas Setters (que cambian el valor de una variable) o Getters (que leen el valor de la variable)

También es conveniente hacer las clases pequeñas y que cada una se encargue de una serie de tareas muy determinadas y nada más. Cuanto más concisa sea una clase, mejor.
« Última modificación: 15 de Julio de 2022, 12:08:18 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Dudas (varias) con la POO en python.
« Respuesta #2 en: 15 de Julio de 2022, 12:04:37 »
A partir de ahí voy a intentar reprogramar el ejemplo que has aportado.

A ver que te parece este:

Código: Python
  1. class Producto:
  2.     def __init__(self, codigo, nombre, precio):
  3.        self.set_all(codigo, nombre, precio)
  4.        
  5.     def __str__(self):
  6.         return f"{self.codigo}, {self.nombre}, {self.precio:.2f}"
  7.  
  8.     def get_all(self):
  9.         return [self.codigo, self.nombre, self.precio]
  10.  
  11.     def get_code(self):
  12.         return self.codigo
  13.    
  14.     def set_all(self, codigo, nombre, precio):
  15.         self.codigo = codigo
  16.         self.nombre = nombre
  17.         self.precio = precio
  18.        
  19.  
  20. class Productos:
  21.     def __init__(self):
  22.         self.listado = {}
  23.  
  24.     def append(self, producto):
  25.         self.listado[producto.get_code()] = producto
  26.  
  27.     def __str__(self):
  28.         codigos = list(self.listado.keys())
  29.         codigos.sort()
  30.         salida = ['Código, Producto, Precio']
  31.         for codigo in codigos:
  32.             salida.append(str(self.listado[codigo]))
  33.         return '\n'.join(salida)
  34.  
  35.  
  36. def main():
  37.     productos = Productos()
  38.    
  39.     producto = Producto(15, 'Tomate frito', 3.25)
  40.     productos.append(producto)
  41.  
  42.     producto = Producto(10, 'Alcachofas', 2.30)
  43.     productos.append(producto)
  44.  
  45.     producto = Producto(12, 'Café molido', 4.55)
  46.     productos.append(producto)
  47.  
  48.     print(productos)
  49.  
  50.  
  51. if __name__ == '__main__':
  52.     main()

Salida
Código: [Seleccionar]
Código, Producto, Precio
10, Alcachofas, 2.30
12, Café molido, 4.55
15, Tomate frito, 3.25

Te recomiendo que no utilices la entrada interactiva para que sea más sencillo probar si ha funcionado sin tener que volver a introducir todos los datos. En ocasiones es mejor que el programa sea interactivo, pero ahora es un engorro tener que volver a introducir todo en cada prueba.
« Última modificación: 15 de Julio de 2022, 12:06:46 por Picuino »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Dudas (varias) con la POO en python.
« Respuesta #3 en: 15 de Julio de 2022, 16:20:37 »
Gracias Picuino por tu tiempo.
Seguramente tu código es muy avanzado para mí,
hace tan solo 3 días que comencé con la POO y como
comprenderás no entiendo nada, pero nada, por lo tanto,
lo voy a dejar para más adelante, gracias.

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Dudas (varias) con la POO en python.
« Respuesta #4 en: 15 de Julio de 2022, 19:59:27 »
De todas formas intentaré poner un ejemplo más sencillo

Código: Python
  1. class Producto:
  2.     def __init__(self, codigo, nombre, precio):
  3.         self.codigo = codigo
  4.         self.nombre = nombre
  5.         self.precio = precio
  6.        
  7.     def __str__(self):
  8.         return f"{self.codigo}, {self.nombre}, {self.precio:.2f}"
  9.  
  10.  
  11. def main():
  12.     producto1 = Producto(15, 'Tomate frito', 3.25)
  13.     producto2 = Producto(10, 'Alcachofas', 2.30)
  14.  
  15.     print(producto1)
  16.     print(producto2)
  17.  
  18.  
  19. if __name__ == '__main__':
  20.     main()

La clase Producto define tres variables (código, nombre y precio) y dos funciones ( __init__() y  __str__() llamadas métodos por estar definidas dentro de una clase)

Esta línea define una instancia de la clase Producto():

    producto1 = Producto(15, 'Tomate frito', 3.25)

Si la clase es una definición de variables y funciones, la instancia es como una declaración de una variable. Puedes declarar tantas variables como quieras:

    producto2 = Producto(10, 'Alcachofas', 2.30)

Cada vez que declaras una nueva instancia, la función __init__() le da un valor de inicio.

Luego, cada vez que intentas imprimir cada instancia de Producto(), se llama a la función __str__() que lo que hace es traducir el valor interno de las variables a una cadena de texto.

El resultado es el siguiente:

Código: [Seleccionar]
15, Tomate frito, 3.25
10, Alcachofas, 2.30

¿Ahora mejor?
« Última modificación: 15 de Julio de 2022, 20:01:36 por Picuino »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Dudas (varias) con la POO en python.
« Respuesta #5 en: 16 de Julio de 2022, 09:19:42 »
Bien Picuino, valoro mucho lo que expusiste  ((:-)) ((:-)) ((:-)), de sobremanera
la teoría tan necesaria para interpretar la POO, muchas gracias.-

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Dudas (varias) con la POO en python.
« Respuesta #6 en: 16 de Julio de 2022, 11:34:45 »
El profesor que vive dentro de Picuino no tiene precio  ((:-)) ((:-)) ((:-))

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Dudas (varias) con la POO en python.
« Respuesta #7 en: 16 de Julio de 2022, 11:49:48 »
Hola Nocturno, ¿cómo estás?
No le cuentes esto, que quede entre nosotros, pero créeme que si
ese profesor me explicara todos esos métodos(uno x uno) estaría
dispuesto a pedirle el CBU ¿se entiende?.-
Si aprendiera el significado de cada uno de los métodos del primer
programa creo que tendría el 80% de la POO aprendido.-

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Dudas (varias) con la POO en python.
« Respuesta #8 en: 16 de Julio de 2022, 16:05:20 »
Muchas gracias a los dos.
También hay que entender que hay ocasiones en las que soy más alumno que profesor.
Explicar algo es la mejor manera de entenderlo bien. O sea que yo también aprendo según explico las ideas. Incluso aunque me parezcan sencillas, que no son todas.


Si aprendiera el significado de cada uno de los métodos del primer
programa creo que tendría el 80% de la POO aprendido.-
En realidad hay bastante que aprender en la POO, pero el primer programa no tiene tanto como imaginas.

Vamos con un segundo programa.

Código: Python
  1. class Producto:
  2.     def __init__(self, codigo, nombre, precio):
  3.         self.codigo = codigo
  4.         self.nombre = nombre
  5.         self.precio = precio
  6.        
  7.     def __str__(self):
  8.         return f"{self.codigo}, {self.nombre}, {self.precio:.2f}"
  9.  
  10.  
  11. class Productos:
  12.     def __init__(self):
  13.         self.listado = {}
  14.  
  15.     def append(self, producto):
  16.         codigo = producto.codigo
  17.         self.listado[producto.codigo] = producto
  18.  
  19.     def __str__(self):
  20.         salida = 'Código, Producto, Precio\n'
  21.         for codigo in self.listado:
  22.             producto = self.listado[codigo]
  23.             salida = salida + str(producto) + '\n'
  24.         return salida
  25.  
  26.    
  27. def main():
  28.     producto1 = Producto(15, 'Tomate frito', 3.25)
  29.     producto2 = Producto(10, 'Alcachofas', 2.30)
  30.  
  31.     productos_de_comida = Productos()
  32.     productos_de_comida.append(producto1)
  33.     productos_de_comida.append(producto2)
  34.  
  35.     print(productos_de_comida)
  36.    
  37.  
  38. if __name__ == '__main__':
  39.     main()

Ahora he añadido una clase más al programa. Si la primera clase (Producto) podía almacenar un solo producto, la nueva clase (Productos) puede almacenar todo un listado de productos.
Tiene un método __init__() que crea la variable donde vamos a almacenar todos los productos.
Otro método append() añade un nuevo producto al listado de productos.
Por último el método __str__() convierte el listado de productos en una cadena de texto para que se pueda representar por pantalla.

El programa main define dos productos (igual que antes)
Después se crea una instancia de la nueva clase "Productos" llamada "productos_de_comida" que va a almacenar los dos productos anteriores.

También podríamos hacer una nueva instancia de la clase "Productos" llamada "productos_de_jardineria" para almacenar otros productos de un departamento diferente.

Por último se imprime la instancia "productos_de_comida" que llamará al método __str__() para convertir los datos en una cadena de texto que se pueda imprimir.
La salida es esta:

Código: [Seleccionar]
Código, Producto, Precio
15, Tomate frito, 3.25
10, Alcachofas, 2.30



Imagino que todavía tendrás dudas, pregunta lo que quieras o juega con el programa para ver qué se puede hacer con él.

Saludos.
« Última modificación: 16 de Julio de 2022, 16:09:00 por Picuino »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Dudas (varias) con la POO en python.
« Respuesta #9 en: 18 de Julio de 2022, 11:52:17 »
Hola Picuino, gracias por todo y cuando me surja alguna duda(cientos, jajajajaj)
me tendrán por aquí, abrazo...

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-


 

anything