Los métodos especiales (también llamados dunder methods por “double underscore”) son funciones con nombres como __init__, __str__, __len__, etc.
Permiten que tus clases:
se comporten como tipos nativos
funcionen con operadores (
+,<,==, etc.)se integren con funciones internas (
len(),print(),iter(), etc.)
1. __init__ – Constructor
Ya lo conocéis: se ejecuta al crear un objeto.
def __init__(self, nombre):
self.nombre = nombre
2. __str__ – Representación amigable
Define cómo se muestra el objeto al imprimirlo.
def __str__(self):
return f"Producto: {self.nombre}"
3. __repr__ – Representación técnica
Pensado para depuración.
Si no existe __str__, print() usa __repr__.
def __repr__(self):
return f"Producto('{self.nombre}', {self.precio})"
4. __len__ – Longitud del objeto
Permite usar len(obj).
def __len__(self):
return len(self.items)
5. __eq__, __lt__, __gt__ – Comparaciones
Permiten comparar objetos con ==, <, >…
def __eq__(self, other):
return self.id == other.id
6. __add__, __sub__, __mul__ – Sobrecarga de operadores
Permiten usar operadores matemáticos con objetos.
def __add__(self, other):
return self.precio + other.precio
7. __getitem__ y __setitem__ – Acceso como lista/dict
Permiten usar obj[key].
def __getitem__(self, index):
return self.items[index]
8. __iter__ – Iteración
Permite recorrer el objeto con un for.
def __iter__(self):
return iter(self.items)
ACTIVIDAD PRÁCTICA: “Carrito de la compra inteligente”
Objetivo: que tus alumnos creen una clase que se comporte como una colección real, con métodos especiales útiles.
Enunciado
Crea una clase Carrito que:
Atributos:
items→ lista de productos (strings)precios→ lista de precios (floats)
Métodos especiales:
__str__()→ mostrar el carrito de forma legible__len__()→ número de productos__getitem__()→ acceder a un producto por índice__add__()→ combinar dos carritos__iter__()→ recorrer productos con unfor
Después:
Crea dos carritos
Añade productos
Combínalos con
+Recorre el carrito combinado
Muestra su longitud
Solución propuesta
class Carrito:
def __init__(self):
self.items = []
self.precios = []
def añadir(self, producto, precio):
self.items.append(producto)
self.precios.append(precio)
# 1. Representación amigable
def __str__(self):
texto = "Carrito:\n"
for p, precio in zip(self.items, self.precios):
texto += f"- {p}: {precio}€\n"
return texto
# 2. Longitud
def __len__(self):
return len(self.items)
# 3. Acceso por índice
def __getitem__(self, index):
return self.items[index], self.precios[index]
# 4. Suma de carritos
def __add__(self, other):
nuevo = Carrito()
nuevo.items = self.items + other.items
nuevo.precios = self.precios + other.precios
return nuevo
# 5. Iteración
def __iter__(self):
return iter(zip(self.items, self.precios))
# --- PRUEBAS ---
c1 = Carrito()
c1.añadir("Teclado", 20)
c1.añadir("Ratón", 15)
c2 = Carrito()
c2.añadir("Monitor", 150)
# Combinar carritos
c3 = c1 + c2
print(c3)
print("Número de productos:", len(c3))
print("Primer producto:", c3[0])
print("\nRecorriendo el carrito:")
for producto, precio in c3:
print(producto, precio)