Чем отличается метод `__str__` от метода `__repr__`?

Метод __str__ предназначен для создания "человекочитаемого" представления объекта, используемого для отображения информации конечному пользователю (например, при вызове print()). Метод __repr__, наоборот, должен возвращать "однозначное" строковое представление объекта, полезное для отладки и разработки. В идеале, eval(repr(object)) == object должно возвращать True. Если __str__ не определен, Python использует __repr__, как запасной вариант.

Методы __str__ и __repr__ в Python используются для представления объектов в виде строк, но преследуют разные цели:

__str__:

  • Предназначен для создания неформального или удобочитаемого представления объекта, предназначенного для конечного пользователя.
  • Ориентирован на то, чтобы информация была легкой для понимания и не обязательно содержала все детали объекта.
  • Вызывается функцией str() и неявно используется функцией print().
  • Если __str__ не определен, Python пытается использовать __repr__ в качестве запасного варианта.
  • Пример: str(datetime.datetime.now()) может вернуть что-то вроде '2023-10-27 10:00:00' - достаточно для понимания, но без детальной информации.

__repr__:

  • Предназначен для создания формального или однозначного представления объекта, предназначенного для разработчиков.
  • Ориентирован на то, чтобы предоставить достаточно информации для воссоздания объекта, если это возможно (в идеале).
  • Вызывается функцией repr() и используется по умолчанию в интерактивной консоли Python, когда вы просто вводите имя объекта.
  • В идеале, eval(repr(object)) == object должно быть истинным (если объект воссоздаваемый).
  • Если __repr__ не определен, используется представление по умолчанию, которое обычно включает имя класса и адрес объекта в памяти.
  • Пример: repr(datetime.datetime.now()) может вернуть что-то вроде 'datetime.datetime(2023, 10, 27, 10, 0, 0, 123456)' - все необходимые детали для воссоздания объекта.

Вкратце:

  • __str__: Удобное для пользователя представление.
  • __repr__: Однозначное, ориентированное на разработчика представление (в идеале, воссоздающее объект).

Рекомендации:

  • Всегда реализуйте __repr__. Это "последняя линия обороны" для представления объекта.
  • Реализуйте __str__, если хотите предоставить более дружелюбное представление для пользователей.
  • Если __str__ не определен, Python использует __repr__, поэтому __repr__ должен предоставлять полезную информацию в любом случае.
0