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.xі self.y: %rслід використовувати замість %sоперації форматування рядків (оскільки клас не визначає __str__, __repr__насправді повертається все-таки, але це аномалія).
Це досить добре пояснено в документації Python :
repr ( об'єкт ): повертає рядок, що містить представлене зображення, яке можна роздрукувати. Це те саме значення, яке отримують конверсії (зворотні лапки). Іноді корисно мати доступ до цієї операції як звичайної функції. Для багатьох типів ця функція робить спробу повернути рядок, який дав би об'єкт з тим же значенням при передачі
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()ing клас буде зателефонувати __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. Коли ми це робимо, ми хотіли б, щоб значення було представлене у висновку в якомусь зрозумілому однозначному форматі. Магнезії спеціальний метод може бути використаний для організації , щоб це відбулося. Якщо ми визначимо цей метод, він може викликатися автоматично, коли ми друкуємо значення екземпляра класу, для якого ми визначили цей метод. Слід зазначити, що існує також спеціальний метод 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)
Реалізуйте repr для кожного класу, який ви реалізуєте. Не повинно бути виправдань. Реалізувати вул для класів , які ви думаєте , читаність є більш важливим не-двозначності.
Перейдіть за цим посиланням: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
>>> variableдрукується те, що__repr__()повертається?