Эти "магические методы" служат для строкового представления объектов, но имеют разные цели и поведение. Понимание их различий критически важно для написания корректных Python-классов.
class Example:
def __init__(self, data):
self.data = data
def __str__(self):
return f"Example: {self.data}"
def __repr__(self):
return f"Example(data={repr(self.data)})"
str() и print()repr(), а также при отображении в REPL| Характеристика | __str__ | __repr__ |
|---|---|---|
| Целевая аудитория | Конечные пользователи | Разработчики |
| Использование | print(obj), str(obj) | repr(obj), REPL, отладка |
| Требования | Читаемость | Однозначность |
| Идеальный вывод | "Понятный текст" | Python-код для воссоздания |
| Обязательность | Опциональный | Рекомендуется для всех классов |
Если __str__ не определен, Python использует __repr__ как fallback:
class DefaultExample:
def __repr__(self):
return "DefaultExample()"
obj = DefaultExample()
print(obj) # Выведет: DefaultExample() - использует __repr__
from datetime import datetime
now = datetime.now()
print(str(now)) # '2023-05-15 14:30:00' - для пользователя
print(repr(now)) # 'datetime.datetime(2023, 5, 15, 14, 30)' - для разработчика
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def __str__(self):
return f"{self.name} - ${self.price:.2f}"
def __repr__(self):
return f"Product(name={repr(self.name)}, price={self.price})"
p = Product("Laptop", 999.99)
print(p) # Laptop - $999.99
print(repr(p)) # Product(name='Laptop', price=999.99)
Для __repr__:
eval()repr() для строковых атрибутовДля __str__:
Общее правило:
__repr____str__ - опционально, если нужен особый пользовательский выводitems = [1, 2, 3]
print(str(items)) # '[1, 2, 3]'
print(repr(items)) # '[1, 2, 3]' (для простых типов может совпадать)
class Debuggable:
def __repr__(self):
return f"{self.__class__.__name__}(id={id(self)})"
__str__ - для "красивого" вывода (пользователи), __repr__ - для точного (разработчики)__repr__ должен быть максимально информативным и желательно воспроизводимым__str__, Python использует __repr____repr__ для своих классовstr() и repr() могут давать одинаковый выводПравило из официальной документации:
__repr__должен быть однозначным, а__str__- читаемым.