Cuando trabajas con clases en Python, los métodos mágicos (o Magic Methods) te permiten definir cómo se comportan tus objetos en operaciones comunes como imprimir, comparar o sumar. Dominar estos métodos transforma la forma en que diseñas tus clases y hace que tu código sea más expresivo y legible.
¿Qué son los métodos mágicos y para qué sirven?
Los métodos mágicos son funciones especiales que Python reconoce internamente y que añaden funcionalidad personalizada a las clases que creas. Se identifican porque están rodeados por doble guion bajo, como __str__ o __eq__. No los llamas directamente en la mayoría de los casos; Python los invoca de forma automática cuando realizas ciertas operaciones con los objetos.
Para entender su funcionamiento, se parte de una clase Persona con dos atributos: nombre y edad. A partir de esta estructura básica se implementan distintos métodos mágicos.
python
class Persona:
def init(self, nombre, edad):
self.nombre = nombre
self.edad = edad
El constructor __init__ ya es en sí mismo un método mágico: se ejecuta automáticamente al crear una nueva instancia de la clase.
¿Cómo representar un objeto como cadena con __str__?
El método __str__ define cómo se presenta un objeto cuando es convertido a cadena o cuando usas print() sobre él [1:22]. Sin este método, al imprimir un objeto solo verías una referencia de memoria poco útil.
python
def str(self):
return f"Persona: {self.nombre}, {self.edad} años"
- Al ejecutar
print(p1), el resultado es algo como: Persona: Ana, 28 años.
- Este método está pensado para el usuario final, ofreciendo una lectura clara y amigable.
¿Qué diferencia hay entre __str__ y __repr__?
Mientras __str__ ofrece una versión legible, el método __repr__ devuelve una representación oficial o detallada del objeto [2:48]. Su propósito es ser más técnico, útil para depuración.
python
def repr(self):
return f"Persona(nombre='{self.nombre}', edad={self.edad})"
- Aquí se especifica que el objeto es de tipo
Persona y se detallan sus atributos con sus valores.
- Para invocarlo directamente se utiliza
repr(p1), sin guiones bajos.
¿Cómo comparar objetos en Python con métodos mágicos?
Una de las capacidades más poderosas es definir cómo se comparan dos objetos. El método __eq__ establece la lógica de igualdad usando el operador == [3:38].
python
def eq(self, otra):
return self.nombre == otra.nombre and self.edad == otra.edad
- Si
p1 tiene nombre "Ana" y edad 28, y p3 tiene exactamente los mismos valores, la comparación p1 == p3 devuelve True.
- Se comparan todos los atributos que tú decidas, no la referencia en memoria.
¿Cómo determinar si un objeto es menor que otro con __lt__?
El método __lt__ (less than) permite usar el operador < entre objetos, comparando un atributo específico [4:40].
python
def lt(self, otra):
return self.edad < otra.edad
- Al evaluar
p1 < p3, Python compara únicamente la edad de ambos objetos.
- De forma similar, existen métodos para mayor que (
__gt__), mayor o igual (__ge__) y menor o igual (__le__).
¿Cómo sumar atributos de objetos con __add__?
El método __add__ define el comportamiento del operador + entre dos objetos [5:18]. En este caso, se suman las edades de dos personas.
python
def add(self, otra):
return self.edad + otra.edad
- Al ejecutar
p1 + p2, el resultado es la suma de sus edades: 63.
- Este método te da control total sobre qué significa "sumar" dos objetos de tu clase.
Cada uno de estos métodos mágicos personaliza el comportamiento interno de tus objetos sin cambiar la sintaxis natural de Python. Existen muchos más, como __len__, __getitem__ o __contains__, que puedes explorar para ampliar las capacidades de tus clases. ¿Ya los has probado en tus propios proyectos? Comparte tu experiencia en los comentarios.