Что произойдёт, если объект не имеет переопределённого метода `__str__` или `__repr__`?

Если у объекта нет переопределённых методов __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__ используется в качестве его замены.

В заключение, если ни один из методов не переопределен, вы получите стандартное представление объекта, которое хоть и неинформативно с точки зрения бизнес-логики, но позволяет идентифицировать класс объекта и его местоположение в памяти.

0