В чем разница между методами __str__ и __repr__ в Python

Ответ

В Python магические методы __str__ и __repr__ определяют строковое представление объекта, но служат разным целям и аудиториям.

  • __repr__(self)для разработчиков.

    • Цель: Создать недвусмысленное, официальное представление объекта, которое идеально подходит для отладки.
    • Правило хорошего тона: Строка, возвращаемая __repr__, должна быть таким кодом, который может воссоздать объект. То есть eval(repr(obj)) == obj.
    • Когда вызывается: Функцией repr(obj) и при выводе объекта в интерактивной консоли.
  • __str__(self)для пользователей.

    • Цель: Создать читаемое, неформальное представление объекта для конечного пользователя.
    • Когда вызывается: Функцией str(obj) и конструкцией print(obj).

Ключевое правило: Если метод __str__ не реализован, Python автоматически использует __repr__ вместо него. Поэтому рекомендуется всегда реализовывать как минимум __repr__.

Пример

import datetime

class User:
    def __init__(self, username, created_at):
        self.username = username
        self.created_at = created_at

    # Представление для отладки: полное и однозначное
    def __repr__(self):
        return f"User(username='{self.username}', created_at={repr(self.created_at)})"

    # Представление для пользователя: краткое и понятное
    def __str__(self):
        return f"Пользователь: {self.username}"

user = User('admin', datetime.datetime.now())

# Вызов в консоли или repr()
# >> user
# User(username='admin', created_at=datetime.datetime(2023, 10, 27, 10, 30, 0))
print(repr(user))

# Вызов print() или str()
# >> print(user)
# Пользователь: admin
print(str(user))