Вопрос проверяет понимание протоколов представления объектов и различий между пользовательским и отладочным выводом.
__str__ предназначен для человекочитаемого вывода. __repr__ — для технического представления объекта. __repr__ используется в отладке и интерактивной консоли. Если __str__ не определён, Python использует __repr__. Обычно __repr__ должен быть максимально информативным.
Python различает представление объекта для пользователя и для разработчика.
__str__ — строковое представление для пользователя.__repr__ — строковое представление для разработчика и отладки.
Перед примером важно выделить назначение:
__str__
используется print()
читаемый формат
удобен для логов и UI
__repr__
используется в REPL
должен однозначно описывать объект
по возможности позволяет восстановить объект
class User:
def __init__(self, name):
self.name = name
def __str__(self):
return f"User {self.name}"
def __repr__(self):
return f"User(name={self.name!r})"
__str__ — для людей
__repr__ — для разработчиков
Корректная реализация __repr__ упрощает отладку, а __str__ улучшает читаемость вывода.