Выводишь объект в консоль и видишь: <__main__.Zombie object at 0x10e8c4d90>. Бесполезно!
Проблема
class Zombie:
def __init__(self, name, health):
self.name = name
self.health = health
walker = Zombie("Ходок", 50)
print(walker)
# <__main__.Zombie object at 0x10e8c4d90> ← адрес в памяти
Python не знает, как выводить твой класс. Он показывает адрес объекта в памяти.
Решение: __str__
__str__ — магический метод, который вызывается при print(объект) и str(объект).
class Zombie:
def __init__(self, name, health):
self.name = name
self.health = health
def __str__(self):
return f"Зомби '{self.name}' (HP: {self.health})"
walker = Zombie("Ходок", 50)
print(walker)
# Зомби 'Ходок' (HP: 50)
Примеры
class Zombie:
def __init__(self, name, health):
self.name = name
self.health = health
def __str__(self):
status = "🟢" if self.health > 30 else "🔴"
return f"{status} Зомби '{self.name}' | HP: {self.health}"
walker = Zombie("Ходок", 50)
runner = Zombie("Бегун", 20)
print(walker) # 🟢 Зомби 'Ходок' | HP: 50
print(runner) # 🔴 Зомби 'Бегун' | HP: 20
class Weapon:
def __init__(self, name, damage, ammo):
self.name = name
self.damage = damage
self.ammo = ammo
def __str__(self):
return f"🔫 {self.name} (Урон: {self.damage}, Патроны: {self.ammo})"
pistol = Weapon("Пистолет", 20, 12)
print(pistol) # 🔫 Пистолет (Урон: 20, Патроны: 12)
Как работает __str__
walker = Zombie("Ходок", 50)
print(walker) # Зомби 'Ходок' (HP: 50) ← print()
str(walker) # Зомби 'Ходок' (HP: 50) ← str()
f"Появился {walker}!" # Появился Зомби 'Ходок' (HP: 50)! ← f-строки
zombies = [Zombie("Ходок", 50), Zombie("Бегун", 30)]
for z in zombies:
print(z) # вызывает __str__ для каждого
Правила
__str__ должен возвращать строку — обязательно return, не print.
def __str__(self):
return f"Зомби '{self.name}'" # ✅ возвращает строку
__repr__ — для отладки
class Zombie:
def __str__(self):
return f"Зомби '{self.name}'" # для пользователя
def __repr__(self):
return f"Zombie(name='{self.name}', health={self.health})" # для отладки
walker = Zombie("Ходок", 50)
print(walker) # Зомби 'Ходок'
print(repr(walker)) # Zombie(name='Ходок', health=50)
__str__— читаемо для пользователя__repr__— точно для программиста (можно скопировать и выполнить)
Другие магические методы
class Horde:
def __init__(self):
self.zombies = []
def add(self, zombie):
self.zombies.append(zombie)
def __len__(self):
return len(self.zombies) # len(horde) → количество зомби
class Zombie:
def __eq__(self, other):
return self.name == other.name and self.health == other.health # z1 == z2
| Метод | Вызов | Назначение |
|---|---|---|
__init__ |
Zombie() |
Создание объекта |
__str__ |
print(obj), str(obj), f-строки |
Строка для пользователя |
__repr__ |
repr(obj) |
Строка для отладки |
__len__ |
len(obj) |
Длина объекта |
__eq__ |
obj1 == obj2 |
Сравнение |
__add__ |
obj1 + obj2 |
Сложение |
Частые ошибки
Ошибка 1: print вместо return
def __str__(self):
print(f"Зомби '{self.name}'") # ❌ print вместо return — вернёт None
def __str__(self):
return f"Зомби '{self.name}'" # ✅
Ошибка 2: Возврат не строки
def __str__(self):
return self.health # ❌ TypeError: __str__ returned non-string
def __str__(self):
return f"HP: {self.health}" # ✅
Итого
__str__ — магический метод для красивого вывода объектов. Вызывается автоматически при print(), str() и в f-строках. Всегда должен возвращать строку через return.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!