Как использовать __repr__ в Python?
Когда следует использовать .repr() против .str() в Python?
by Stephen Gruppetta Mar 22, 2023 0 Комментарии
Одним из наиболее распространенных задач, которую выполняет программа на компьютере, является отображение данных. Программа часто отображает эту информацию пользователю программы. Однако программа также должна отображать информацию для программиста, разрабатывающего и поддерживающего ее. Информация, которая необходима программисту о объекте, отличается от того, как программа должна отображать тот же объект для пользователя, и вот здесь и приходят на помощь .__repr__()
против .__str__()
.
В Python объект имеет несколько специальных методов, которые предоставляют определенное поведение. Существуют два похожих специальных метода, которые описывают объект с использованием строкового представления. Это методы .__repr__()
и .__str__()
. Метод .__repr__()
возвращает подробное описание для программиста, который нуждается в его поддержке и отладке кода. Метод .__str__()
возвращает упрощенное описание с информацией для пользователя программы.
Методы .__repr__()
и .__str__()
- это два из специальных методов, которые вы можете определить для любого класса. Они позволяют вам контролировать, как программа отображает объект в различных формах вывода, таких, как вывод из функции print()
, форматированные строки и интерактивные среды.
В этом руководстве вы узнаете, как различать .__repr__()
и .__str__()
и как использовать эти специальные методы в определении классов. Определение этих методов делает ваши классы более читабельными и удобными для отладки и поддержки. Так что когда следует выбирать . __repr__()
против . __str__()
в Python?
Вкратце: использовать . __repr__()
для программистов против . __str__()
для пользователей
Специальные методы .__repr__()
и .__str__()
возвращают строковые представления объекта. Строковое представление - это строка, которая показывает информацию об объекте. Вы можете настроить эту информацию для различных аудиторий, таких как пользователи программы или ваши коллеги-программисты.
Как и с другими специальными методами с двойными подчеркиваниями в их именах, вы можете определить эти методы для любого класса.
Причина, по которой существуют два метода для отображения объекта, заключается в том, что они имеют разные цели:
. __repr__()
предоставляет официальное строковое представление объекта, нацеленное на программиста.. __str__()
предоставляет неформальное строковое представление объекта, нацеленное на пользователя.
Целевая аудитория для строкового представления, возвращаемого .__repr__()
, - это программист, разрабатывающий и поддерживающий программу. В общем, он предоставляет подробную и однозначную информацию об объекте. Еще одно важное свойство официального строкового представления заключается в том, что программист обычно может использовать его для создания объекта, равного исходному.
Метод . __str__()
предоставляет строковое представление, нацеленное на пользователя программы, который не обязательно является Python-программистом. Следовательно, это представление позволяет любому пользователю понять объект без необходимости разбираться в его подробностях.
Как получить доступ к строковым представлениям объекта?
Строковое представление объекта можно получить с помощью встроенных функций Python, таких как str()
и repr()
, или при выполнении операций, которые требуют преобразования объекта в строку, например, при использовании функции print()
.
Обратите внимание, что по умолчанию объекты класса имеют официальное строковое представление вида <__main__.Point object at 0x110d0cb90>
. Это не очень читабельно для пользователя программы. Вам может потребоваться определить методы .__repr__()
и .__str__()
для вашего собственного класса, чтобы предоставить более информативные и понятные строковые представления.
Теперь объект Point
имеет пользовательское строковое представление в виде '(3, 4)'
, которое понятно и удобочитаемо. Официальное строковое представление теперь выглядит как 'Point(x=3, y=4)'
, что предоставляет подробную информацию о состоянии объекта для программиста.
Следует ли определять .repr() и .str() в пользовательском классе?
Определение методов .__repr__()
и .__str__()
в пользовательском классе является хорошей практикой. Они делают ваш код более читабельным и легким для отладки и понимания. Когда вы используете .__repr__()
и .__str__()
вместе, вы предоставляете два различных представления объекта для разных аудиторий.
Однако определение данных методов не является обязательным и зависит от ваших конкретных потребностей. В некоторых случаях может быть достаточно использовать только один из этих методов или вообще не определять их, особенно если вы работаете с небольшими прототипами или простыми классами.
Определение . __repr__()
занимает некоторое время и усилия, поэтому само по себе не является обязательным. Но если вы хотите предоставить программистам более полезное и понятное описание объекта для отладки и поддержки, определение . __repr__()
является хорошей практикой.
Заключение
. __repr__()
и . __str__()
предоставляют вам контроль над тем, как ваш класс отображается в виде строки. Предоставление этих методов в классах, которые вы определяете, улучшает читаемость кода и облегчает отладку и поддержку. Выбор использования . __repr__()
или . __str__()
зависит от вашей целевой аудитории и предполагаемого использования строки представления.
Определение . __repr__()
обычно делает ваш класс более полезным для программистов, поскольку предоставляет подробное и однозначное описание объекта. Определение . __str__()
делает ваш класс более понятным для пользователя программы, поскольку предоставляет более простое и информативное описание.
Определение . __repr__()
и . __str__()
является лучшей практикой при определении ваших собственных классов, поскольку это делает код более читабельным и удобным для отладки и понимания. Однако это не является обязательным требованием, и в зависимости от конкретных требований и ограничений проекта вы можете выбрать, определять или не определять эти методы в вашем классе.