Цель Python __repr__

139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

Каково значение / цель этого метода?

zjm1126
источник
@ zjm1126: вы хотите знать, почему >>> variableпечатает, что __repr__()возвращает?
Эстебан Кубер
19
Эта документация усыпляет людей. Кроме того, полезно узнать от других, как это используется.
Concerned_Citizen
Возможный дубликат разницы между __str__ и __repr__ в Python
Влад Безден
2
Для разработчиков Java, которые изучают Python, лучший способ взглянуть на это как toString () в Java.
Рави

Ответы:

189

__repr__должен возвращать печатное представление объекта, скорее всего, один из способов создать этот объект. Смотрите официальную документацию здесь . __repr__больше для разработчиков, а __str__для конечных пользователей.

Простой пример:

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
lazy1
источник
2
lazy1: я в первую очередь хотел исправить форматирование (полезно, чтобы примеры соответствовали как можно ближе к тому, что они увидят в примере сеанса), но я также настроил формат вывода так, чтобы он явно отличался от назначения, так как значительно улучшает ясность для кого-то смущенного по этому поводу, imho. (Если я ушел далеко, просто отредактируйте, и я должен вам пива.)
2
Опущена ссылка: docs.python.org/reference/datamodel.html#object.__repr__
S.Lott
1
Возможно, следует использовать% r вместо% s: stackoverflow.com/questions/6005159/…
Джонатан Адельсон
43
Это не совсем правильно. __str__является выводом, который должен быть читаемым человеком: __repr__должен быть представлением, читаемым для интерпретатора Python (т. е. передача строки интерпретатору должна воссоздать объект). Если объект не имеет __str__метода, однако, __repr__используется вместо этого. Также, как отмечено: этот пример фактически печатает __str__метод self.xand self.y: %rдолжен использоваться вместо %sоперации форматирования строки (поскольку класс не определяет __str__, __repr__фактически возвращается в любом случае, но это аномалия).
Даниэль Андерссон
20

Это хорошо объясняется в документации по Python :

repr ( object ): возвращает строку, содержащую печатное представление объекта. Это то же самое значение, которое получается при конвертации (обратные кавычки). Иногда полезно иметь доступ к этой операции как к обычной функции. Для многих типов эта функция пытается вернуть строку, которая при передаче в объект выдаст объект с тем же значением eval(), в противном случае представление представляет собой строку, заключенную в угловые скобки, которая содержит имя типа объекта вместе с дополнительной информацией. часто в том числе название и адрес объекта. Класс может управлять тем, что эта функция возвращает для своих экземпляров, определяя __repr__()метод.

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

dmazzoni
источник
5
Я думаю, что обратные кавычки (или обратные кавычки) метод получения «представления» объекта устарел и был удален для версии 3.0
MatrixFrog
MatrixFrog: оба верны, но текущая документация 2.x по-прежнему говорит об этом, откуда и цитата.
Для многих объектов __repr__ и __str__ являются одной и той же функцией. Фактически, если вы определяете только __str__, тогда __repr__ по умолчанию просто вызывает __str__. Наиболее очевидный случай, когда это не так, - это сами строки: str ('stackoverflow') возвращает, stackoverflowа repr ('stackoverflow') - 'stackoverflow'.
MatrixFrog
6
Вы имеете это задом наперед, __repr__ никогда не использует __str__, но может произойти обратное. См. Docs.python.org/reference/…
13

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

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

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

>>> str(demo)
'<StackOverflow demo object __repr__>'

Кроме того, print()класс будет вызываться __str__по умолчанию.


Документация , пожалуйста


источник
7

Метод __repr__ просто сообщает Python, как печатать объекты класса

Джаспер Киноти
источник
1

Пример, чтобы увидеть различия между ними (я скопировал из этого источника ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

Возвраты repr()и str()идентичны для int x, но есть разница между возвращаемыми значениями для str y- одно формально, а другое неформально . Одним из наиболее важных различий между формальным и неформальным представлениями является то, что реализация по умолчанию __repr__для значения str может быть вызвана в качестве аргумента для eval, а возвращаемое значение будет допустимым строковым объектом, например так:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Если вы попытаетесь вызвать возвращаемое значение __str__в качестве аргумента для eval, результат не будет действительным.

Ань Ти ДИНХ
источник
1

Когда мы создаем новые типы, определяя классы, мы можем воспользоваться некоторыми функциями Python, чтобы сделать новые классы удобными в использовании. Одной из таких функций являются «специальные методы», также называемые «магическими методами».

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

Удобно иметь возможность выводить значение экземпляра объекта с помощью оператора print. Когда мы сделаем это, мы хотим, чтобы значение было представлено в выводе в некотором понятном однозначном формате. Для этого может быть использован специальный метод repr . Если мы определяем этот метод, он может вызываться автоматически, когда мы печатаем значение экземпляра класса, для которого мы определили этот метод. Следует отметить, однако, что существует также специальный метод str , используемый для аналогичной, но не идентичной цели, который может получить приоритет, если мы также определили его.

Если мы не определили метод repr для класса Point3D и создали экземпляр my_point как экземпляр Point3D, а затем мы сделаем это ...

напечатайте my_point ... мы можем увидеть это как вывод ...

Не очень приятно, а?

Итак, мы определяем специальный метод repr или str или оба, чтобы получить лучший результат.

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

Вывод ...

(1, 2, 3) (1, 2, 3)

Ашиш Ананд
источник
0

Реализовать магнезии для каждого класса вы реализуете. Там не должно быть никаких оправданий. Реализуйте str для классов, которые, по вашему мнению, читаемость важнее не двусмысленности.

Перейдите по этой ссылке: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /

srav
источник