Подтвердить что ты не робот

Назначение Python __repr__

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

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

4b9b3361

Ответ 1

__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)

Ответ 2

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

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

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

Ответ 3

__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(demo)
'<StackOverflow demo object __repr__>'

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


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

Ответ 4

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

Ответ 5

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

>>> 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, результат не будет действительным.

Ответ 6

Когда мы создаем новые типы, определяя классы, мы можем воспользоваться некоторыми функциями 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)