__str__ and __repr__
By default, printing an object shows something unhelpful like <Dog object at 0x...>. Define __str__ to fix this.
class Dog:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Dog named {self.name}"
Now printing shows your custom message:
buddy = Dog("Buddy")
print(buddy) # Dog named Buddy
__repr__ is for developers - it should show how to recreate the object:
def __repr__(self):
return f"Dog('{self.name}')"
__str__ is for users, __repr__ is for debugging. If you only define one, define __repr__.
I explain magic methods in my Python OOP course.