Эти "магические методы" служат для строкового представления объектов, но имеют разные цели и поведение. Понимание их различий критически важно для написания корректных 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__
- читаемым.