Глава 14 · Создаём объекты реального мира
Гонка Turtle с объектами
Переписываем гонку из главы 12 с собственным классом — и подводим итоги главы.
Вернёмся к гонке черепашек из главы 12 — на этот раз обернём каждого участника в свой
собственный класс, а не просто в объект turtle.Turtle напрямую.
gonka_s_klassom.py
import random
class Uchastnik:
def __init__(self, cvet, startovyj_y):
self.t = turtle.Turtle()
self.t.shape("turtle")
self.t.color(cvet)
self.t.penup()
self.t.goto(-200, startovyj_y)
self.cvet = cvet
def sdelat_shag(self):
self.t.forward(random.randint(1, 10))
def finishiroval(self, finish_line):
return self.t.xcor() >= finish_line
cveta = ["red", "blue", "green", "orange"]
uchastniki = [Uchastnik(cvet, i * 40 - 60) for i, cvet in enumerate(cveta)]
pobeditel = None
while pobeditel is None:
for u in uchastniki:
u.sdelat_shag()
if u.finishiroval(200):
pobeditel = u.cvet
break
print(f"Победил участник цвета {pobeditel}!")
Зачем оборачивать Turtle в свой класс?
В главе 12 логика гонки (движение, проверка финиша) была разбросана по основному коду. Теперь каждый участник — самостоятельный объект
Uchastnik, который сам знает, как сделать шаг и как проверить, финишировал ли он. Для маленькой гонки разница не критична, но в более крупных программах именно так поддерживают порядок при росте кода.★★★ Задача повышенной сложности
Счёт очков
Добавьте классу Uchastnik атрибут ochki и метод nabrat_ochki(n), увеличивающий счёт — начислите очки победителю в конце гонки.
Итоги
Что мы узнали в этой главе
- ООП организует код вокруг объектов — данных и действий, собранных вместе.
classопределяет чертёж объекта;__init__настраивает его начальное состояние.self— ссылка объекта на самого себя, обязательный первый параметр каждого метода.- Атрибуты хранят данные объекта и независимы у каждого экземпляра класса.
- Методы — функции внутри класса, дающие объекту собственные действия — работают точно так же, как уже знакомые
.forward(),.upper(),.append().