Введение
В этой статье вы узнаете о специальных методах __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)
Вывод:
Outputmydate1 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))
Вывод:
OutputThe 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