Метод __repr__
в Python выдает текстовое или строковое представление сущности или объекта. Этот процесс вызывается всякий раз при вызове метода repr()
для какой-то сущности. Можно сказать, что методы repr()
и __repr__
взаимозаменяемы.
Функция __str__
в Python делает то же самое, но ее поведение всё же немного отличается. Она предназначена для создания удобочитаемой версии, полезной для отслеживания или отображения информации об объекте. А метод __repr__
предназначен для предоставления «официального» текстового образа объекта, который можно использовать для воссоздания этого объекта.
В этой статье мы на примерах разберем работу методов __repr__
и __str__
. Итак, давайте начнем!
Пример 1
Откройте среду разработки для Python в своей системе. Сначала мы рассмотрим простой метод repr()
.
Начнем с инициализации строковой переменной, содержащей предложение в качестве значения. Функция print()
используется для вывода на экран строкового значения переменной string
. Для получения именно строкового значения мы воспользовались методом repr()
, которому передали string
в качестве аргумента.
Далее мы применили функцию repr()
к математическому выражению и попробовали вывести результат через ту же функцию print()
. Что ж, давайте теперь посмотрим на то, что у нас получилось:
string = 'Hy! I am John' print (repr(string)) print (repr(5.0/11.0)) # Output: # 'Hy! I am John' # 0.45454545454545453
Из полученных данных видно, что метод repr()
показывает строкове представление как строки, так и результата математического выражения.
Пример 2
Давайте более подробно рассмотрим функции repr()
и str()
, чтобы увидеть разницу между ними. На этот раз мы применим эти методы строкового представления к функциям даты и времени.
Чтобы получить дату и время в нашем коде, мы сначала импортируем модуль DateTime
с помощью ключевого слова import
. Чтобы получить текущую дату и время, мы воспользуемся функцией now()
с классом datetime
. Также мы сохраним текущую метку времени в переменной td
.
Две функции print()
используются для вывода текущей даты и времени в строковом формате с использованием функций __str__()
и __repr__()
для объекта переменной td
.
Давайте посмотрим, что у нас получилось:
import datetime td = datetime.datetime.now() print(td.__str__()) print(td.__repr__()) # Output: # 2022-01-26 08:17:46.276609 # datetime.datetime(2022, 1, 26, 8, 17, 46, 276609)
При запуске этого кода мы получили два разных строковых результата. Первый результат генерируется методом __str__
и вполне очевиден. В то время как другой генерируется с использованием метода __repr__
, и нам его довольно сложно понять.
Пример 3
И последний пример. Воспользуемся определяемым пользователем классом Test
. Этот класс определяет и реализует функцию-конструктор __init__()
для сохранения имени name
и зарплаты salary
в двух разных переменных, v1
и v2
соответственно.
Объект с именем val
создается для передачи двух значений переменных name
и salary
в конструктор функции. Создание объекта val
вызывает автоматический запуск конструктора класса Test
.
Методы __str__
и __repr__
вызываются с использованием объекта val
по отдельности и выводят результаты. Обе функции ничего не получили, так как объект val
был только что создан. Он может реагировать не так, как мы бы хотели. Давайте проверим это:
class Test: def __init__(self, name, salary): self.v1 = name self.v2 = salary val = Test('John', 50000) print(val.__str__()) print(val.__repr__()) # Output: # <__main__.Test object at 0x7f4656a7bbe0> # <__main__.Test object at 0x7f4656a7bbe0>
Здесь выполнение обеих функций по умолчанию совершенно бесполезно. Теперь давайте реализуем обе функции.
Итак, после конструктора __init__()
внутри класса мы по отдельности реализовали оба метода __str__()
и __repr__()
, которые возвращают текст в строковом формате. Они также возвращают значения, присвоенные конструктору, вызывающему объект val
. Давайте запустим обновленный код и посмотрим на результат:
class Test: def __init__(self, name, salary): self.v1 = name self.v2 = salary def __str__(self): return f'User name is {self.v1} and his/her salary is {self.v2}' def __repr__(self): return f'User(name={self.v1}, salary={self.v2})' val = Test('John', 50000) print(val.__str__()) print(val.__repr__()) # Output: # User name is John and his/her salary is 50000 # User(name=John, salary=50000)
Первый вывод вызван методом __str__
и вполне понятен. Другой вывод понятен, но не так хорошо, как вывод функции __str__
.
Заключение
Эта статья посвящена использованию метода __repr__
в Python. Мы также обсудили метод __str__
, используемый в этой статье для показа различий между этими двумя функциями. Думаем, это позволило вам лучше понять метод __repr__
.
Мы очень надеемся, что данная статья была вам полезна! Успехов в написании кода!
Перевод статьи «The__repr__ in Python».