PyQuiz 27 – __str__ personalizado en Python

El reto
class Punto:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f'({self.x}, {self.y})'
p = Punto(3, 4)
print(p)¿Cuál es el resultado?
- a) (3, 4)
- b) <Punto object>
- c) Error
Piensa tu respuesta antes de seguir leyendo…
Concepto: __str__ personalizado
El método especial __str__ define cómo se convierte un objeto a cadena de texto cuando se usa str(objeto) o se pasa a print(). Es parte del protocolo de representación de objetos en Python y permite controlar lo que el usuario ve al imprimir una instancia de una clase.
Sin __str__, Python usa una representación por defecto como <NombreClase object at 0x...>, que muestra la dirección de memoria y no aporta información útil. Al definir __str__, puedes devolver cualquier cadena descriptiva.
Existe también __repr__, pensado para desarrolladores: devuelve una representación inequívoca del objeto, ideal para depuración. Si __str__ no está definido, Python usa __repr__ como sustituto. La convención es: __str__ para el usuario final, __repr__ para el desarrollador.
Paso a paso
class Punto:— se define una clase llamadaPunto.def __init__(self, x, y): self.x = x; self.y = y— el constructor almacena las coordenadasxeycomo atributos del objeto.def __str__(self): return f'({self.x}, {self.y})'— se define el método especial__str__. Devolverá la cadena'(3, 4)'para este objeto.p = Punto(3, 4)— se crea una instancia conx=3ey=4.print(p)—print()llama internamente astr(p), que a su vez invocap.__str__(). El método devuelve'(3, 4)', que es lo que se imprime.
📥 Llévate el cheatsheet de Python (gratis)
PDF de 6 páginas con lo esencial: tipos, condicionales, bucles, estructuras de datos, funciones y los errores que más vas a cometer. Para tener al lado mientras programas.
Sin spam. Te apuntas a la lista, descargas el cheatsheet y recibes contenido de Python cada semana.
Solución
Respuesta correcta: A) (3, 4)
__str__ define cómo se muestra el objeto con print(). Retorna '(3, 4)'.
Sabías que…
Además de __str__, Python tiene un ecosistema de métodos especiales (dunder methods) que permiten que tus objetos se comporten como tipos nativos:
class Punto:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f'({self.x}, {self.y})' # para print()
def __repr__(self):
return f'Punto({self.x}, {self.y})' # para el REPL y depuración
def __add__(self, otro):
return Punto(self.x + otro.x, self.y + otro.y)
def __eq__(self, otro):
return self.x == otro.x and self.y == otro.y
p1 = Punto(1, 2)
p2 = Punto(3, 4)
print(p1 + p2) # (4, 6) -> usa __add__ y __str__
print(p1 == p1) # True -> usa __eq__
print(repr(p1)) # Punto(1, 2) -> usa __repr__
print([p1]) # [Punto(1, 2)] -> listas usan __repr__Prueba tú mismo
Añade un método __repr__ a la clase Punto que devuelva 'Punto(x=3, y=4)'. ¿Qué imprime repr(Punto(3, 4))?
Más PyQuizzes en elpythonista.com/pyquizzes
Tutorial relacionado: Tutorial de Python
¿Quieres aprender Python en orden, no a saltos?
Esto que has leído es solo una pieza. En El Pythonista lo verás todo encadenado: 11 módulos, 37+ horas de vídeo, 734 actividades y un proyecto real (MovieTracker) que crece contigo desde la primera variable hasta el deploy a producción.
37+ horas · 734 actividades · Proyecto real · Acceso de por vida · 14 días de garantía
