Python de Cero a Experto / POO
Dunder methods: objetos que se sienten nativos
¿Por qué print(mi_gasto) muestra algo feo como <__main__.Gasto object at 0x...> en vez de un texto
útil? ¿Y por qué dos gastos "iguales" dan False al compararlos con ==? Porque tus objetos aún no saben
comportarse como los tipos nativos. Los DUNDER METHODS (métodos con doble guion bajo, "double underscore")
lo arreglan: le enseñan a tus objetos a imprimirse bien, compararse, sumarse y más. Son la magia que hace
que las clases de Python se sientan naturales. Hoy los dominas.
Las tomas eléctricas estándar
str y repr: cómo se ve el objeto
Sin __str__, print(cafe) mostraría algo ilegible. Al definir __str__, controlas el texto AMIGABLE
(para el usuario) que muestran print y str(). __repr__ es el texto TÉCNICO (para depurar): la consola
interactiva y las listas lo usan —por eso conviene que __repr__ muestre cómo se creó el objeto—. Regla
práctica: define al menos __repr__ en tus clases (ayuda muchísimo a depurar); agrega __str__ si quieres
una versión bonita para el usuario. El !r en el f-string usa el repr del valor (pone comillas a los
strings).
Igualdad y operadores
¿Para qué sirven __str__ y __eq__, y por qué dos objetos con los mismos datos dan False al compararlos con == si no defines __eq__?
Mini-reto
Dale comportamiento nativo a tu Gasto: 1) implementa __str__ (texto amigable tipo "Café: 4,000") y
__repr__ (técnico tipo "Gasto('Café', 4000)"); 2) implementa __eq__ (iguales si coinciden nombre y
valor) y __add__ (sumar devuelve la suma de los valores); 3) crea varios gastos y prueba print, == y
+. Bonus: implementa __lt__ (menor por valor) y ordena una lista de gastos con sorted.
Qué sigue
Ya tus objetos se sienten nativos. La próxima lección trae la ENCAPSULACIÓN y las PROPERTIES: cómo proteger
los datos de un objeto, exponer propiedades CALCULADAS (como un total con IVA que se calcula solo), y validar
al asignar —con @property, una de las herramientas más elegantes de Python—.