Для разработчиков Java, которые изучают Python, лучший способ взглянуть на это как toString () в Java.
Рави
Ответы:
189
__repr__должен возвращать печатное представление объекта, скорее всего, один из способов создать этот объект. Смотрите официальную документацию здесь . __repr__больше для разработчиков, а __str__для конечных пользователей.
Простой пример:
>>>classPoint:...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: я в первую очередь хотел исправить форматирование (полезно, чтобы примеры соответствовали как можно ближе к тому, что они увидят в примере сеанса), но я также настроил формат вывода так, чтобы он явно отличался от назначения, так как значительно улучшает ясность для кого-то смущенного по этому поводу, imho. (Если я ушел далеко, просто отредактируйте, и я должен вам пива.)
Это не совсем правильно. __str__является выводом, который должен быть читаемым человеком: __repr__должен быть представлением, читаемым для интерпретатора Python (т. е. передача строки интерпретатору должна воссоздать объект). Если объект не имеет __str__метода, однако, __repr__используется вместо этого. Также, как отмечено: этот пример фактически печатает __str__метод self.xand self.y: %rдолжен использоваться вместо %sоперации форматирования строки (поскольку класс не определяет __str__, __repr__фактически возвращается в любом случае, но это аномалия).
repr ( object ): возвращает строку, содержащую печатное представление объекта. Это то же самое значение, которое получается при конвертации (обратные кавычки). Иногда полезно иметь доступ к этой операции как к обычной функции. Для многих типов эта функция пытается вернуть строку, которая при передаче в объект выдаст объект с тем же значением eval(), в противном случае представление представляет собой строку, заключенную в угловые скобки, которая содержит имя типа объекта вместе с дополнительной информацией. часто в том числе название и адрес объекта. Класс может управлять тем, что эта функция возвращает для своих экземпляров, определяя __repr__()метод.
Так что вы видите здесь реализацию по умолчанию __repr__, которая полезна для сериализации и отладки.
Я думаю, что обратные кавычки (или обратные кавычки) метод получения «представления» объекта устарел и был удален для версии 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__функцию в попытке создать печатное представление.
Возвраты repr()и str()идентичны для int x, но есть разница между возвращаемыми значениями для stry- одно формально, а другое неформально . Одним из наиболее важных различий между формальным и неформальным представлениями является то, что реализация по умолчанию __repr__для значения str может быть вызвана в качестве аргумента для eval, а возвращаемое значение будет допустимым строковым объектом, например так:
Когда мы создаем новые типы, определяя классы, мы можем воспользоваться некоторыми функциями Python, чтобы сделать новые классы удобными в использовании. Одной из таких функций являются «специальные методы», также называемые «магическими методами».
Специальные методы имеют имена, которые начинаются и заканчиваются двумя подчеркиваниями. Мы определяем их, но обычно не называем их напрямую по имени. Вместо этого они выполняются автоматически при определенных обстоятельствах.
Удобно иметь возможность выводить значение экземпляра объекта с помощью оператора print. Когда мы сделаем это, мы хотим, чтобы значение было представлено в выводе в некотором понятном однозначном формате. Для этого может быть использован специальный метод repr . Если мы определяем этот метод, он может вызываться автоматически, когда мы печатаем значение экземпляра класса, для которого мы определили этот метод. Следует отметить, однако, что существует также специальный метод str , используемый для аналогичной, но не идентичной цели, который может получить приоритет, если мы также определили его.
Если мы не определили метод repr для класса Point3D и создали экземпляр my_point как экземпляр Point3D, а затем мы сделаем это ...
напечатайте my_point ... мы можем увидеть это как вывод ...
Не очень приятно, а?
Итак, мы определяем специальный метод repr или str или оба, чтобы получить лучший результат.
**classPoint3D(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 automaticallyprint my_point # __str__ gets called automatically**
Реализовать магнезии для каждого класса вы реализуете. Там не должно быть никаких оправданий. Реализуйте str для классов, которые, по вашему мнению, читаемость важнее не двусмысленности.
>>> variable
печатает, что__repr__()
возвращает?Ответы:
__repr__
должен возвращать печатное представление объекта, скорее всего, один из способов создать этот объект. Смотрите официальную документацию здесь .__repr__
больше для разработчиков, а__str__
для конечных пользователей.Простой пример:
источник
__str__
является выводом, который должен быть читаемым человеком:__repr__
должен быть представлением, читаемым для интерпретатора Python (т. е. передача строки интерпретатору должна воссоздать объект). Если объект не имеет__str__
метода, однако,__repr__
используется вместо этого. Также, как отмечено: этот пример фактически печатает__str__
методself.x
andself.y
:%r
должен использоваться вместо%s
операции форматирования строки (поскольку класс не определяет__str__
,__repr__
фактически возвращается в любом случае, но это аномалия).Это хорошо объясняется в документации по Python :
Так что вы видите здесь реализацию по умолчанию
__repr__
, которая полезна для сериализации и отладки.источник
stackoverflow
а repr ('stackoverflow') -'stackoverflow'
.__repr__
используется автономным интерпретатором Python для отображения класса в печатном формате. Пример:В случаях, когда
__str__
метод не определен в классе, он вызовет__repr__
функцию в попытке создать печатное представление.Кроме того,
print()
класс будет вызываться__str__
по умолчанию.Документация , пожалуйста
источник
Метод __repr__ просто сообщает Python, как печатать объекты класса
источник
Пример, чтобы увидеть различия между ними (я скопировал из этого источника ),
Возвраты
repr()
иstr()
идентичны дляint x
, но есть разница между возвращаемыми значениями дляstr
y
- одно формально, а другое неформально . Одним из наиболее важных различий между формальным и неформальным представлениями является то, что реализация по умолчанию__repr__
для значения str может быть вызвана в качестве аргумента для eval, а возвращаемое значение будет допустимым строковым объектом, например так:Если вы попытаетесь вызвать возвращаемое значение
__str__
в качестве аргумента для eval, результат не будет действительным.источник
Когда мы создаем новые типы, определяя классы, мы можем воспользоваться некоторыми функциями Python, чтобы сделать новые классы удобными в использовании. Одной из таких функций являются «специальные методы», также называемые «магическими методами».
Специальные методы имеют имена, которые начинаются и заканчиваются двумя подчеркиваниями. Мы определяем их, но обычно не называем их напрямую по имени. Вместо этого они выполняются автоматически при определенных обстоятельствах.
Удобно иметь возможность выводить значение экземпляра объекта с помощью оператора print. Когда мы сделаем это, мы хотим, чтобы значение было представлено в выводе в некотором понятном однозначном формате. Для этого может быть использован специальный метод repr . Если мы определяем этот метод, он может вызываться автоматически, когда мы печатаем значение экземпляра класса, для которого мы определили этот метод. Следует отметить, однако, что существует также специальный метод str , используемый для аналогичной, но не идентичной цели, который может получить приоритет, если мы также определили его.
Если мы не определили метод repr для класса Point3D и создали экземпляр my_point как экземпляр Point3D, а затем мы сделаем это ...
напечатайте my_point ... мы можем увидеть это как вывод ...
Не очень приятно, а?
Итак, мы определяем специальный метод repr или str или оба, чтобы получить лучший результат.
Вывод ...
(1, 2, 3) (1, 2, 3)
источник
Реализовать магнезии для каждого класса вы реализуете. Там не должно быть никаких оправданий. Реализуйте str для классов, которые, по вашему мнению, читаемость важнее не двусмысленности.
Перейдите по этой ссылке: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
источник