def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Каково значение / цель этого метода?
def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Каково значение / цель этого метода?
Ответы:
__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)
__str__является выводом, который должен быть читаемым человеком: __repr__должен быть представлением, читаемым для интерпретатора Python (т. е. передача строки интерпретатору должна воссоздать объект). Если объект не имеет __str__метода, однако, __repr__используется вместо этого. Также, как отмечено: этот пример фактически печатает __str__метод self.xand self.y: %rдолжен использоваться вместо %sоперации форматирования строки (поскольку класс не определяет __str__, __repr__фактически возвращается в любом случае, но это аномалия).
Это хорошо объясняется в документации по Python :
repr ( object ): возвращает строку, содержащую печатное представление объекта. Это то же самое значение, которое получается при конвертации (обратные кавычки). Иногда полезно иметь доступ к этой операции как к обычной функции. Для многих типов эта функция пытается вернуть строку, которая при передаче в объект выдаст объект с тем же значением
eval(), в противном случае представление представляет собой строку, заключенную в угловые скобки, которая содержит имя типа объекта вместе с дополнительной информацией. часто в том числе название и адрес объекта. Класс может управлять тем, что эта функция возвращает для своих экземпляров, определяя__repr__()метод.
Так что вы видите здесь реализацию по умолчанию __repr__, которая полезна для сериализации и отладки.
stackoverflowа repr ('stackoverflow') - 'stackoverflow'.
__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__по умолчанию.
Документация , пожалуйста
Метод __repr__ просто сообщает Python, как печатать объекты класса
Пример, чтобы увидеть различия между ними (я скопировал из этого источника ),
>>> 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, результат не будет действительным.
Когда мы создаем новые типы, определяя классы, мы можем воспользоваться некоторыми функциями 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)
Реализовать магнезии для каждого класса вы реализуете. Там не должно быть никаких оправданий. Реализуйте str для классов, которые, по вашему мнению, читаемость важнее не двусмысленности.
Перейдите по этой ссылке: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
>>> variableпечатает, что__repr__()возвращает?