МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ
«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»
Методическая разработка
«Магические методы __str__ и __repr__ в Python. Задачи»
к дополнительной общеобразовательной
общеразвивающей программе
технической направленности
«Программирование на Python»
Возраст детей: 10-17 лет
Автор: Костычев Вадим Александрович
г. Заречный Пензенской области
2025 г.
Данный материал предназначен для преподавателей информатики, программирования и студентов (учащихся), изучающих язык программирования Python. Он может быть использован как на лекциях, так и при проведении практических занятий или самостоятельной работе.
Цель: формирование у обучающихся навыков проектирования пользовательских классов в языке Python посредством реализации магических методов __str__ и __repr__, обеспечивающих корректное строковое представление объектов для взаимодействия с пользователем и отладки программы.
Задачи:
Понять, зачем нужны __str__ и __repr__;
Научиться писать эти методы;
Уметь отличать, когда какой метод используется;
Сделать свои классы удобными и «говорящими».
Задача 1. Робот, который умеет представляться
Создайте класс Robot, у которого есть имя. Сделайте так, чтобы:
print(robot) выводил: "Hello! I'm robot Bob."
Если просто написать robot в консоли Python, появилось: "Robot(name='Bob')"
Решение:
class Robot:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Hello! I'm robot {self.name}."
def __repr__(self):
return f"Robot(name='{self.name}')"
r = Robot("Bob")
print(r) # Hello! I'm robot Bob.
print([r]) # [Robot(name='Bob')]
Задача 2. Питомец в компьютерной игре
Создайте класс Pet с именем и возрастом.
print(pet) должен выводить: "Dog named Barboss, 3 years old"
В списке питомцев должно отображаться: [Pet(name='Barboss', age=3)]
Решение:
class Pet:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Dog named {self.name}, {self.age} years old"
def __repr__(self):
return f"Pet(name='{self.name}', age={self.age})"
p = Pet("Barboss", 3)
print(p) # Dog named Barboss, 3 years old
print([p]) # [Pet(name='Barboss', age=3)]
Задача 3. Найди и исправь ошибку!
Вот неправильный код. Найдите ошибку и исправьте, чтобы repr() работал правильно:
class Book:
def __init__(self, title):
self.title = title
def __repr__(self):
return f"Book({self.title})"
Проблема:
Если название книги — "Harry Potter", то repr выведет:
Book(Harry Potter) — но это не настоящий код Python, потому что нет кавычек вокруг названия!
Правильное решение:
def __repr__(self):
return f"Book(title='{self.title}')"
Или ещё лучше — используем встроенную функцию repr() для строки:
def __repr__(self):
return f"Book(title={repr(self.title)})"
Теперь результат можно скопировать и вставить в код — и он заработает без ошибок!
Задача 4. Мини-игра: Герой и монстр
Условие:
Создайте два класса: Hero и Monster.
У героя: имя и здоровье (health).
У монстра: имя и сила (power).
Сделайте так, чтобы:
print(hero) → "Hero Alice (health: 100)"
print(monster) → "Monster Dragon (power: 50)"
В списке: [Hero(name='Alice', health=100), Monster(name='Dragon', power=50)]
class Hero:
def __init__(self, name, health):
self.name = name
self.health = health
def __str__(self):
return f"Hero {self.name} (health: {self.health})"
def __repr__(self):
return f"Hero(name='{self.name}', health={self.health})"
class Monster:
def __init__(self, name, power):
self.name = name
self.power = power
def __str__(self):
return f"Monster {self.name} (power: {self.power})"
def __repr__(self):
return f"Monster(name='{self.name}', power={self.power})"
hero = Hero("Alice", 100)
monster = Monster("Dragon", 50)
print(hero) # Hero Alice (health: 100)
print(monster) # Monster Dragon (power: 50)
print([hero, monster]) # [Hero(name='Alice', health=100), Monster(name='Dragon', power=50)]
Полезные советы
Всегда пишите __repr__ — даже если не используете __str__. Без него отладка будет сложной.
Ставьте кавычки вокруг строк в __repr__! Иначе Python не поймёт, что это строка.
Представьте, что объект — это персонаж:
__str__ — как он скажет о себе на сцене,
__repr__ — как о нём напишут в техническом паспорте.
Проверяйте в консоли: просто напишите имя объекта и нажмите Enter — вы увидите __repr__.
Задача для самостоятельного решения.
Проверьте себя, напишите, что выведет данный код.
class Fruit:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Delicious {self.name}"
def __repr__(self):
return f"Fruit(name='{self.name}')"
f = Fruit("orange")
print(f)
print([f])
Заключение
Магические методы __str__ и __repr__ играют ключевую роль в создании понятных, удобных и профессионально оформленных классов в Python. Их правильное использование повышает читаемость кода, упрощает отладку и делает взаимодействие с объектами интуитивно ясным как для разработчика, так и для конечного пользователя. Освоение этих методов — важный шаг на пути к написанию качественного кода.