Как использовать методы __str__() и __repr__() в Python

Введение

В этой статье вы узнаете о специальных методах __str__() и __repr__(), определенных в модели данных Python. Методы __str__() и __repr__() могут быть полезны при отладке кода на Python, записывая или печатая полезную информацию о объекте.

Специальные методы Python начинаются и заканчиваются двойным подчеркиванием и неформально известны как дандер-методы. Дандер-методы являются базовыми методами для встроенных операторов и функций Python. Вы должны избегать прямого вызова дандер-методов и вместо этого реализовывать дандер-методы в своем классе, а затем использовать встроенные функции, вызывающие их, такие как str() и repr().

В чем разница между __str__() и __repr__()?

Метод __str__() возвращает человекочитаемое или неформальное строковое представление объекта. Этот метод вызывается встроенными функциями print(), str() и format(). Если вы не определите метод __str__() для класса, то реализация встроенного объекта вызывает метод __repr__().

Метод __repr__() возвращает более информативное или официальное строковое представление объекта. Этот метод вызывается встроенной функцией repr(). Если это возможно, строка должна быть допустимым выражением Python, которое можно использовать для воссоздания объекта. Во всех случаях строка должна быть информативной и однозначной.

В общем случае строка __str__() предназначена для пользователей, а строка __repr__() – для разработчиков.

__str__() и __repr__() Примеры использования встроенного класса

Приведенные примеры в этом разделе вызывают методы __str__() и __repr__() непосредственно в демонстрационных целях.

Класс datetime.datetime – это встроенный класс Python, который имеет стандартную реализацию методов __str__() и __repr__().

Следующий пример кода показывает строки, возвращаемые стандартной реализацией методов __str__() и __repr__() для объекта datetime.datetime:

import datetime

mydate = datetime.datetime.now()

print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))

print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))

Вывод:

Output
__str__() string: 2023-01-27 09:50:37.429078 str() string: 2023-01-27 09:50:37.429078 __repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078) repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)

Вывод показывает, что функция str() вызывает __str__() и возвращает человеко-читаемую строку, в то время как функция repr() вызывает __repr__() и возвращает строку с более подробной информацией, которую можно использовать для воссоздания объекта. Фактически, вы можете использовать функцию repr() с функцией eval() для создания нового объекта из строки:

import datetime

mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))

print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))

print("the values of the objects are equal: ", mydate1==mydate2)

Вывод:

Output
mydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) the values of the objects are equal: True

Приведенный выше пример кода создает объект mydate2 из строки repr() для mydate1, а затем проверяет, что значения обоих объектов равны.

__str__() и __repr__() Примеры с использованием нового класса

При создании класса вы должны реализовать, по крайней мере, метод __repr__(), чтобы при использовании встроенных функций __repr__() возвращалась полезная информация.

Следующий класс не реализует методы __str__() или __repr()__:

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

Вывод при использовании str() и repr():

Output
<__main__.Ocean object at 0x102892860> <__main__.Ocean object at 0x102892860>

Предшествующий пример демонстрирует, что реализация по умолчанию метода __repr()__ для объекта возвращает строку только с классом и идентификатором объекта в шестнадцатеричном формате, что не очень полезно. Обратите внимание, что str() и repr() возвращают одно и то же значение, потому что str() вызывает __repr__(), когда __str__() не реализован.

Обновите класс Ocean, реализовав методы __str__() и __repr__():

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age
    
    def __str__(self):
        return f'The creature type is {self.name} and the age is {self.age}'

    def __repr__(self):
        return f'Ocean(\'{self.name}\', {self.age})'

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

Вывод:

Output
The creature type is Jellyfish and the age is 5 Ocean('Jellyfish', 5)

Реализация метода __str__() в предшествующем примере возвращает строку, легкую для чтения, которая предоставляет соответствующие сведения об объекте для пользователя. Реализация метода __repr__() возвращает строку, которая является допустимым выражением Python, которое можно использовать для воссоздания объекта: Ocean('Медуза', 5). В примере используется форматирование f-строки для строк, но вы можете форматировать строки с использованием любого формата, поддерживаемого Python.

Заключение

В этой статье вы исследовали различия между методами __str__() и __repr__() и реализовали эти специальные методы в классе, чтобы не приходилось вызывать их напрямую. Узнайте больше о работе со строками в Python в наших учебных пособиях по строкам в Python.

Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions