Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Locura_23 en 10 Enero 2023, 01:08 am



Título: Objetos imprimen None
Publicado por: Locura_23 en 10 Enero 2023, 01:08 am
Buenas, una duda, resulta que estoy intentando diseñar una clase en Python pero cada vez que imprimo los objetos se me agrega
un None que no consigo ver de dónde sale...
Todo está en un mismo archivo
Por cierto, estoy empezando en este lenguaje por lo tanto tal vez ignore alguna práctica que sea más recomendable...

La clase es la siguiente y abajo el main.

Código
  1. class Producto:
  2.    contador_productos = 0
  3.    def __init__(self,nombre: str, precio: float):
  4.        self._id = Producto._generar_id()
  5.        self._nombre = nombre
  6.        self._precio = self._verificar_precio(precio)
  7.  
  8.    @staticmethod
  9.    def _generar_id():
  10.        Producto.contador_productos += 1
  11.        return Producto.contador_productos
  12.  
  13.    def obtener_id(self):
  14.        return self._id
  15.  
  16.    def obtener_nombre(self):
  17.        return self._nombre
  18.  
  19.    def obtener_precio(self):
  20.        return self._precio
  21.  
  22.    def _verificar_precio(self,precio):
  23.        if precio > 0:
  24.            return precio
  25.        else:
  26.            return -1
  27.  
  28.    def imprimir_producto(self):
  29.        print(f'{self._id}, {self._nombre}, {self._precio}')
  30.  

Código
  1. def main():
  2.    a = Producto("Mouse",1700)
  3.    b = Producto("Teclado",8000)
  4.    c = Producto("Monitor",15000)
  5.  
  6.    print(a.obtener_id(), a.obtener_nombre(), a.obtener_precio())
  7.    print(b.obtener_id(), b.obtener_nombre(), b.obtener_precio())
  8.    print(c.obtener_id(), c.obtener_nombre(), c.obtener_precio())
  9.  
  10.    print(a.imprimir_producto())
  11.    print(b.imprimir_producto())
  12.    print(c.imprimir_producto())
  13.  
  14. if __name__ == '__main__':
  15.    main()
  16.  

salida:

1 Mouse 1700
2 Teclado 8000
3 Monitor 15000
1, Mouse, 1700
None
2, Teclado, 8000
None
3, Monitor, 15000
None


Título: Re: Objetos imprimen None
Publicado por: MCKSys Argentina en 10 Enero 2023, 01:25 am
Hola!

Prueba reemplazando el print con return imprimir_producto (quita los paréntesis de la función)

Saludos!


Título: Re: Objetos imprimen None
Publicado por: Locura_23 en 10 Enero 2023, 01:48 am
Es cierto, era un problema en esa función jaja gracias genio
se solucionó así

Código
  1.    def imprimir_producto(self):
  2.        return f'{self._id}, {self._nombre}, {self._precio}'
  3.  


Título: Re: Objetos imprimen None
Publicado por: reymosquito en 10 Enero 2023, 05:01 am
veamos:
1)que raro que usas return en casi todas las funciones y justo esa tiene un print. Es un error pésimo usar funciones sin que retornen algo, de ahí el none.
2) está bien que estás empezando con el lenguaje pero hay muchas cosas innecesarias, muchas faltantes y lo peor una mala lógica en lo que esperas lograr, por ejemplo imaginate que tenés que agregar miles de productos, no sirve declararlos como lo estás haciendo, para eso existe como mínimo los nodos y los árboles, aunque es otro tema anda viendo otra forma de hacer lo mismo.
3)tengo un ratito y como estoy aburrido cambiaré algunas cosas para ver si te sirven de guía:
Código
  1. class Producto:
  2.    contador_productos = 0
  3.    def __init__(self,nombre: str, precio: float):
  4.        self._id = Producto._generar_id()
  5.        self._nombre = nombre
  6.        self._precio = self._verificar_precio(precio)
  7.  
  8.    @staticmethod
  9.    def _generar_id():
  10.        Producto.contador_productos += 1
  11.        return Producto.contador_productos
  12.  
  13.    def __str__(self):
  14.        return f'{self._id},{self._nombre},{self._precio}'
  15.  
  16.    def _verificar_precio(self,precio):
  17.        return precio if precio > 0 else  -1
  18.  
  19. def main():
  20.    a = Producto("Mouse",1700)
  21.    b = Producto("Teclado",8000)
  22.    c = Producto("Monitor",15000)
  23.  
  24.    print(f"""{a._id},{a._nombre},{a._precio}
  25. {b._id},{b._nombre},{b._precio}
  26. {c._id},{c._nombre},{c._precio} \n""")
  27.  
  28.    print(f"{a}\n{b}\n{c}")
  29.  
  30. if __name__ == '__main__':
  31.    main()
  32.  


Donde obtenés lo mismo, agregando solo una función y eliminando varias,
obviamente los print del main son repetitivos ya que ambos obtienen lo mismo,
pero como dije antes es una muy mala idea la forma en que estas creando los objetos.


Título: Re: Objetos imprimen None
Publicado por: Locura_23 en 10 Enero 2023, 19:45 pm
Sí desde luego no está pensado para que se pueda implementar en un sistema, es solo una práctica. Pero aún así entiendo las observaciones que hiciste, saludos!