Призначення __repr__ Python


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: Ви хочете знати, чому >>> variableдрукується те, що __repr__()повертається?
Естебан Кюбер

18
Ця документація приводить людей до сну. Крім того, корисно дізнатися від інших, як це використовується.
Concerned_Citizen


2
Для розробників Java, які вивчають Python, найкращий спосіб поглянути на це як toString () на Java.
Раві

Відповіді:


188

__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
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.xі self.y: %rслід використовувати замість %sоперації форматування рядків (оскільки клас не визначає __str__, __repr__насправді повертається все-таки, але це аномалія).
Даніель Андерссон

20

Це досить добре пояснено в документації Python :

repr ( об'єкт ): повертає рядок, що містить представлене зображення, яке можна роздрукувати. Це те саме значення, яке отримують конверсії (зворотні лапки). Іноді корисно мати доступ до цієї операції як звичайної функції. Для багатьох типів ця функція робить спробу повернути рядок, який дав би об'єкт з тим же значенням при передачі eval(), інакше подання являє собою рядок, укладений у кутові дужки, який містить ім'я типу об'єкта разом з додатковою інформацією часто включаючи ім’я та адресу об’єкта. Клас може контролювати те, що ця функція повертає для своїх примірників, визначаючи __repr__()метод.

Тож, що ви бачите тут, це реалізація за замовчуванням __repr__, що корисно для серіалізації та налагодження.


5
Я думаю, що метод зворотних лапок (або "backticks") отримання "представлення" об'єкта застарілий, і був видалений для версії 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()ing клас буде зателефонувати __str__за замовчуванням.


Документація , якщо ласка



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. Коли ми це робимо, ми хотіли б, щоб значення було представлене у висновку в якомусь зрозумілому однозначному форматі. Магнезії спеціальний метод може бути використаний для організації , щоб це відбулося. Якщо ми визначимо цей метод, він може викликатися автоматично, коли ми друкуємо значення екземпляра класу, для якого ми визначили цей метод. Слід зазначити, що існує також спеціальний метод str , який використовується для подібної, але не тотожної мети, який може отримати перевагу, якщо ми також це визначили.

Якщо ми не визначені, магнезії методи класу 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)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.