Метод __repr__ в Python

Метод __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() показывает строкове представление как строки, так и результата математического выражения.

[python_ad_block]

Пример 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».