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

В чем разница между __str__ и __repr__?

1.0 Junior🔥 171 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между str и repr

str предназначен для пользователя (end-user) и возвращает удобное, человекочитаемое представление объекта. Вызывается функцией str() и print().

repr предназначен для разработчика и возвращает однозначное, детальное представление для отладки. Вызывается функцией repr() и в интерпретаторе.

Примеры

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __str__(self):
        return f"{self.name}, {self.age} лет"
    
    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"

person = Person("Иван", 30)
print(person)      # Иван, 30 лет
print(repr(person)) # Person(name='Иван', age=30)

Где используются

str вызывается при print() и str():

print(person)  # используется __str__
text = str(person)  # используется __str__

repr вызывается при repr() и в интерпретаторе:

print(repr(person))  # использует __repr__
person  # в интерпретаторе использует __repr__

Списки используют repr

people = [Person("Иван", 30), Person("Мария", 25)]
print(people)  # использует __repr__ каждого элемента

F-строки

print(f"Это: {person}")     # __str__
print(f"Debug: {person!r}")  # __repr__

Правила

  1. Если str не определен, используется repr
  2. repr должен помогать разработчику отладить объект
  3. str должен быть понятен конечному пользователю
  4. Идеально, если repr позволяет воссоздать объект

Пример с разными представлениями

class Order:
    def __init__(self, order_id, status):
        self.order_id = order_id
        self.status = status
    
    def __str__(self):
        return f"Заказ #{self.order_id}: {self.status}"
    
    def __repr__(self):
        return f"Order(order_id={self.order_id}, status='{self.status}')"

order = Order(123, "shipped")
print(order)        # Заказ #123: shipped
print(repr(order))  # Order(order_id=123, status='shipped')

Итоговое сравнение

Критерийstrrepr
АудиторияПользовательРазработчик
НазначениеУдобный выводТочное представление
Вызовprint(), str(), f-строкиrepr(), интерпретатор
ОбязателенНетРекомендуется
Пример"Заказ #123: shipped""Order(order_id=123, status='shipped')"

Основное правило: всегда определяй repr, а str — только если требуется специальное форматирование для пользователей.