__str__ и __repr__, то при попытке его строкового представления (например, через str(object) или print(object)), будет использована реализация, предоставленная базовым классом object.  Эта реализация обычно возвращает строку, содержащую тип объекта и его адрес в памяти (например, <__main__.MyClass object at 0x...>).
Если у объекта в Python не переопределен ни метод __str__, ни метод __repr__, то при попытке получить строковое представление объекта (например, при использовании функций str(), print() или при форматировании строки с использованием %s или {}), будет вызван метод __repr__, унаследованный от базового класса object.
По умолчанию, метод object.__repr__ возвращает строку вида <__main__.ИмяКласса object at АдресВПамяти>.  __main__ будет заменено именем модуля, где определён класс. ИмяКласса – это имя класса объекта. АдресВПамяти – это шестнадцатеричное представление адреса объекта в памяти.
Важно понимать, что в Python  __str__ предназначен для получения "дружественного" представления объекта, которое удобно читать пользователю.  __repr__, в свою очередь,  предназначен для получения "однозначного" представления объекта, которое полезно для отладки и может быть использовано для воссоздания объекта. Если __str__ не определен, то __repr__ используется в качестве его замены.
В заключение, если ни один из методов не переопределен, вы получите стандартное представление объекта, которое хоть и неинформативно с точки зрения бизнес-логики, но позволяет идентифицировать класс объекта и его местоположение в памяти.