Узнайте, в чем разница между методами  __str__ и в Python. __repr__

Оба являются специальными методами (также известными как » dunder-methods «), которые возвращают строки на основе состояния объекта. Для встроенных классов эти методы уже реализованы, и рекомендуется реализовать их самостоятельно при создании пользовательского класса.

Давайте посмотрим на документы:

Вызывается функцией str(object) и встроенными функциями format() и print() для вычисления «неформального» или удобного для печати строкового представления объекта. Возвращаемое значение должно быть строковым объектом. […]

object.__repr__(self)  (Ссылка)

Вызывается встроенной функцией repr() для вычисления «официального» строкового представления объекта. […] . Если класс определяет __repr__() , но не __str__() , то __repr__() также используется, когда требуется «неформальное» строковое представление экземпляров этого класса.

Обычно это используется для отладки, поэтому важно, чтобы представление было информативным и однозначным.

Итак, подводя итоги, мы можем сказать:

  • __repr__ должен быть однозначным (и, возможно, машиночитаемым)
  • __str__ должен быть удобочитаемым для человека
  • __repr__ является запасным вариантом для __str__, если __str__ отсутствует
  • Вызов print()использует __str__

—> Если вы можете написать только один, начните с __repr__.

Еще одно практическое правило: __repr__ — для разработчиков, __str__ — для клиентов.

Давайте посмотрим на пример:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2021-08-12 20:17:04.066084'
>>> repr(today)
'datetime.datetime(2021, 8, 12, 20, 17, 4, 66084)'

>>> print(today) # __str__ is used
'2021-08-12 20:17:04.066084'
>>> today # __repr__ is used
'datetime.datetime(2021, 8, 12, 20, 17, 4, 66084)'

 

Как мы видим, использование __str__ отображает объект даты в чистой строке даты, а __repr__ также показывает информацию о модуле.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии