Ответ
В 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))