__str__, __repr__ & Magic Methods
Magic (dunder) methods let you define how objects behave with built-in Python operations like printing, arithmetic, and comparison.
__str__ vs __repr__
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
# For developers — should be unambiguous
return f"Vector({self.x!r}, {self.y!r})"
def __str__(self):
# For end users — readable
return f"({self.x}, {self.y})"
v = Vector(3, 4)
print(v) # (3, 4) — uses __str__
print(repr(v)) # Vector(3, 4) — uses __repr__Arithmetic Magic Methods
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
def __abs__(self):
return (self.x**2 + self.y**2) ** 0.5
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # (4, 6)
print(v1 * 3) # (3, 6)
print(abs(v2)) # 5.0Comparison & Container
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __len__(self):
return 2 # a 2D vector has 2 components
def __getitem__(self, index):
return (self.x, self.y)[index]