📝 Python

Метод __str__: красивый вывод объектов

P
Автор
PyLand Team
📅
Опубликовано
03.04.2026
⏱️
Время чтения
2 мин
👁️
Просмотров
376
🌿
Уровень
Средний

Выводишь объект в консоль и видишь: <__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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

if __name__ == "__main__": точка входа Python

Конструкция if name == "main" определяет точку входа Python-программы: она помогает отличить прямой запуск файла...

📅 14.08.2026 👁️ 44
📝

strip() и lower(): подготавливаем пользовательски…

Пользователь может ввести правильное слово с лишними пробелами или буквами другого регистра. Для Python строки...

📅 11.08.2026 👁️ 50
📝

ord(), chr() и циклический сдвиг букв в Python 🔐

Строка состоит из символов, но компьютер хранит каждый символ как числовой код. Python позволяет переходить...

📅 09.08.2026 👁️ 89
🎓 Продолжить обучение

В каких курсах используется этот материал

Перейдите к курсу, чтобы закрепить материал на практике.

Python с нуля: 7 практических проектов Открыть программу курса