`__repr__` is an unambiguous description for developers. `__str__` is the readable version for `print()`. If there's no `__str__`, print() uses `__repr__`.
```python
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __repr__(self):
return f"Point({self.x}, {self.y})"
def __str__(self):
return f"({self.x}, {self.y})"
p = Point(1, 2)
print(p) # → (1, 2)
print(repr(p)) # → Point(1, 2)
print([p]) # → [Point(1, 2)] ← lists show each item's repr
```