CodeForge

Python de Cero a Experto / POO

Dunder methods: objetos que se sienten nativos

Teoría22 min20 XP

¿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—.