Разница между __str__и __repr__. (4/5)

python magic-methods repr




Answer 16 zangw


Важно помнить, что контейнер __str__ использует содержащиеся в нем объекты __repr__ .

>>> from datetime import datetime
>>> from decimal import Decimal
>>> print (Decimal('52'), datetime.now())
(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 51, 26, 185000))
>>> str((Decimal('52'), datetime.now()))
"(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 52, 22, 176000))"

Python предпочитает однозначность, а не читабельность , вызов tuple __str__ вызывает __repr__ содержащихся объектов , «формальное» представление объекта. Хотя формальное представление труднее читать, чем неформальное, оно однозначно и более устойчиво к ошибкам.




Answer 17 ShadowWalker


В двух словах:

class Demo:
  def __repr__(self):
    return 'repr'
  def __str__(self):
    return 'str'

demo = Demo()
print(demo) # use __str__, output 'str' to stdout

s = str(demo) # __str__ is used, return 'str'
r = repr(demo) # __repr__ is used, return 'repr'

import logging
logger = logging.getLogger(logging.INFO)
logger.info(demo) # use __str__, output 'str' to stdout

from pprint import pprint, pformat
pprint(demo) # use __repr__, output 'repr' to stdout
result = pformat(demo) # use __repr__, result is string which value is 'str'



Answer 18 BattleDrum


>>> print(decimal.Decimal(23) / decimal.Decimal("1.05"))
21.90476190476190476190476190
>>> decimal.Decimal(23) / decimal.Decimal("1.05")
Decimal('21.90476190476190476190476190')

Когда print() вызывается по результату decimal.Decimal(23) / decimal.Decimal("1.05") печатается необработанное число; это вывод в виде строки, который может быть достигнут с __str__() . Если мы просто введем выражение, мы получим decimal.Decimal вывод. Десятичный вывод - этот вывод представлен в форме представления, которая может быть достигнута с помощью __repr__() . Все объекты Python имеют две выходные формы. Строковая форма разработана для восприятия человеком. Представительная форма предназначена для создания выходных данных, которые при передаче интерпретатору Python (когда это возможно) воспроизводят представленный объект.




Answer 19 Calculus


Понять __str__ и __repr__ интуитивно и постоянно различать их вообще.

__str__ возвращает замаскированное тело строки данного объекта для чтения из глаз
__repr__ возвращает реальное телесное тело данного объекта (возвращает себя) для однозначности идентификации.

Посмотрите на пример

In [30]: str(datetime.datetime.now())
Out[30]: '2017-12-07 15:41:14.002752'
Disguised in string form

Что касается __repr__

In [32]: datetime.datetime.now()
Out[32]: datetime.datetime(2017, 12, 7, 15, 43, 27, 297769)
Presence in real body which allows to be manipulated directly.

Мы можем удобно выполнять арифметическую операцию с результатами __repr__ .

In [33]: datetime.datetime.now()
Out[33]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521)
In [34]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521) - datetime.datetime(2
    ...: 017, 12, 7, 15, 43, 27, 297769)
Out[34]: datetime.timedelta(0, 222, 443752)

если применить операцию на __str__

In [35]: '2017-12-07 15:43:14.002752' - '2017-12-07 15:41:14.002752'
TypeError: unsupported operand type(s) for -: 'str' and 'str'

Не возвращает ничего,кроме ошибки.

Еще один пример.

In [36]: str('string_body')
Out[36]: 'string_body' # in string form

In [37]: repr('real_body')
Out[37]: "'real_body'" #its real body hide inside

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




Answer 20 Sampath


  1. __str__ должен возвращать строковый объект, тогда как __repr__ может возвращать любое выражение python.
  2. Если реализация __str__ отсутствует, то функция __repr__ используется как запасной вариант. Нет __repr__ если отсутствует реализация функции __repr__ .
  3. Если функция __repr__ возвращает строковое представление объекта, мы можем пропустить реализацию функции __str__ .

Источник: https://www.journaldev.com/22460/python-str-repr-functions