← Назад к вопросам
В чем разница между __str__ и __repr__ в Python?
1.0 Junior🔥 101 комментариев
#Python
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между str и repr в Python
Это два специальных метода для представления объектов, но они служат разным целям.
str (String Representation)
Предназначение: красивое, человекочитаемое представление объекта
- Вызывается функцией str() и print()
- Предназначен для конечного пользователя
- Должен быть информативным и легко читаемым
- Если не определен, используется repr
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} ({self.age} лет)"
user = User("Иван", 30)
print(user) # Вывод: Иван (30 лет)
print(str(user)) # Вывод: Иван (30 лет)
repr (Representation)
Предназначение: однозначное представление объекта для разработчиков
- Вызывается функцией repr() и при выводе в интерпретаторе
- Предназначен для разработчиков, отладки и логирования
- Идеально: должен быть достаточным для пересоздания объекта
- Используется по умолчанию, если str не определен
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"User(name='{self.name}', age={self.age})"
user = User("Иван", 30)
print(repr(user)) # Вывод: User(name='Иван', age=30)
user # В интерпретаторе: User(name='Иван', age=30)
Практический пример с обоими методами
import pandas as pd
from datetime import datetime
class Model:
def __init__(self, name, accuracy, created_at):
self.name = name
self.accuracy = accuracy
self.created_at = created_at
def __str__(self):
# Для пользователей - красиво и понятно
return f"Model: {self.name}\nAccuracy: {self.accuracy:.2%}\nCreated: {self.created_at.strftime('%d.%m.%Y')}"
def __repr__(self):
# Для разработчиков - точное представление
return f"Model(name={self.name!r}, accuracy={self.accuracy}, created_at={self.created_at!r})"
model = Model("RandomForest", 0.95, datetime(2024, 3, 28))
print(model) # __str__ - читаемый формат
# Model: RandomForest
# Accuracy: 95.00%
# Created: 28.03.2024
print(repr(model)) # __repr__ - точное представление
# Model(name='RandomForest', accuracy=0.95, created_at=datetime.datetime(2024, 3, 28, 0, 0))
Поведение в контекстах
| Контекст | Вызываемый метод | Пример |
|---|---|---|
| print(obj) | str | Красивый вывод |
| str(obj) | str | String conversion |
| repr(obj) | repr | Точное представление |
| obj в интерпретаторе | repr | Отладочная информация |
| f"{obj}" | str | В f-строках |
| f"{obj!r}" | repr | В f-строках с флагом !r |
| list с объектом | repr | [User(...), User(...)] |
Лучшие практики
1. Всегда определяй repr
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Point(x={self.x}, y={self.y})"
# Опционально - если нужен более красивый вывод
def __str__(self):
return f"({self.x}, {self.y})"
2. Используй repr() в логировании
import logging
logger = logging.getLogger(__name__)
logger.debug(f"Processing model: {model!r}") # !r вызовет __repr__
3. В pandas DataFrame
# __str__ вызывается для красивого вывода в Jupyter
df = pd.DataFrame(...)
df # Использует __str__ для красивой таблицы
В заключение: repr должен быть в каждом классе для корректной отладки, а str опционален и используется, когда нужен пользовательский, более красивый вывод.