← Назад к вопросам

В чем разница между __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)strString 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 опционален и используется, когда нужен пользовательский, более красивый вывод.