Как использовать методы __str__() и __repr__() в Python
Введение
В этой статье вы узнаете о специальных методах __str__()
и __repr__()
, определенных в модели данных Python. Методы __str__()
и __repr__()
могут быть полезны при отладке кода Python путем регистрации или вывода полезной информации об объекте.
Специальные методы Python начинаются и заканчиваются двойным подчеркиванием и неофициально известны как dunder-методы. Методы Дандера являются базовыми методами для встроенных операторов и функций Python. Вам следует избегать прямого вызова методов dunder и вместо этого реализовывать методы dunder в своем классе, а затем использовать встроенные функции, которые их вызывают, такие как 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()__
для объекта возвращает строку, содержащую только класс и объект id
в шестнадцатеричном формате, что не очень полезно. . Обратите внимание, что 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(Jellyfish, 5)
. В примере используется форматирование f-строки для строк, но вы можете форматировать строки, используя любой формат, поддерживаемый Python.
Заключение
В этой статье вы изучили различия между методами __str__()
и __repr__()
и реализовали эти специальные методы в классе, так что вам не нужно позвонить им напрямую. Узнайте больше о работе со строками в Python из наших руководств по строкам Python.