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)
Это хорошо объясняется в документации Python:
repr (object): возвращает строку, содержащую печатаемое представление объекта. Это то же значение, которое дает конверсия (обратные кавычки). Иногда полезно иметь доступ к этой операции как к обычной функции. Для многих типов эта функция пытается вернуть строку, которая даст объект с тем же значением при передаче в eval(), иначе представление представляет собой строку, заключенную в угловые скобки, которая содержит имя типа объекта вместе с дополнительной информацией, которая часто включает имя и адрес объекта. Класс может управлять тем, что эта функция возвращает для своих экземпляров, определяя метод __repr __().
Итак, вы видите здесь реализацию по умолчанию __repr__, которая полезна для сериализации и отладки.
__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__
по умолчанию.
Документация, пожалуйста
Метод __ 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)
Реализуйте repr для каждого реализуемого вами класса. Там не должно быть никаких оправданий. Реализуйте str для классов, которые, по вашему мнению, читаемость важнее не двусмысленности.
Перейдите по этой ссылке: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python/