Поиск по сайту:

Как использовать методы __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)

Результат:

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()__ для объекта возвращает строку, содержащую только класс и объект 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))

Результат:

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

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

Заключение

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