Перейти к основному содержимому

Классы и объекты в Python

Родителям и детям
Откуда материал

Глава 8 книги Дж. Бриггса "Python для детей". Статья идёт перед играми "Прыг-скок" и "Человечек спешит к выходу" — там классы Ball, Paddle и Game.

Класс — описание типа вещи в программе. Объект (или экземпляр) — одна конкретная вещь, созданная по этому описанию.

Аналогия из книги:

  • класс Giraffes (жирафы) — общее понятие
  • объект reginald — один конкретный жираф по имени Реджинальд

Тот же приём в turtle: класс Pen, объект avery = turtle.Pen() — см. Черепашка turtle.


Примеры классов и объектов

Что в игре или программеКлассОбъект
Жираф РеджинальдGiraffesreginald = Giraffes()
Черепашка ЭвериPenavery = turtle.Pen()
Красный мячBallball = Ball(canvas, 'red')

Один класс порождает много объектов. Команда harold.move() двигает только Гарольда — у каждого объекта своё состояние.


Иерархия и наследование

Наследование — когда один класс получает методы другого, "родительского". В книге это показано на шутливом дереве:

Метод — функция, привязанная к объекту. Класс Giraffes наследует метод move() от Animals, хотя код move() написан "выше" по дереву.

class Animals:
def move(self):
print('двигается')

class Giraffes(Animals):
def eat_leaves(self):
print('ест листья')

reginald = Giraffes()
reginald.move() # метод родителя Animals
reginald.eat_leaves() # свой метод Giraffes

Запись class Giraffes(Animals) означает: Giraffes наследует от Animals.


Параметр self

self — ссылка на текущий объект. Методы класса почти всегда принимают self первым аргументом.

class Giraffes:
def dance(self):
self.move()
self.move()
print('танцует!')
  • внутри класса пишут self.move()
  • снаружи вызывают reginald.move() — Python сам подставляет объект вместо self

Конструктор init

__init__ — специальный метод, который Python вызывает при создании объекта. В нём задают начальные свойства (атрибуты):

class Giraffes:
def __init__(self, spots):
self.giraffe_spots = spots

ozwald = Giraffes(100)
gertrude = Giraffes(150)
print(ozwald.giraffe_spots) # 100
print(gertrude.giraffe_spots) # 150

self.giraffe_spots — свойство объекта. У Озвальда 100 пятен, у Гертруды — 150, хотя класс один.


Данные и действия в одном объекте

Функция выполняет действие. Класс объединяет данные (координаты, цвет, скорость) и действия (двигаться, отскакивать, рисовать) в одной "коробке".

В игре Прыг-скок класс Ball хранит:

  • self.id — номер фигуры на холсте
  • self.x, self.y — скорость по осям
  • self.hit_bottom — флаг проигрыша

Класс Paddle хранит положение ракетки и обработчики клавиш. Классы группируют переменные по смыслу — отдельно данные мяча, отдельно данные ракетки.


Мини-проект — два мяча

Упрощённый фрагмент из главы 13 (без полного tkinter):

class Ball:
def __init__(self, color, x, y):
self.color = color
self.x = x
self.y = y

def draw(self):
print(f'мяч {self.color} в ({self.x}, {self.y})')

red = Ball('красный', 10, 20)
blue = Ball('синий', 50, 30)
red.draw()
blue.draw()

Позже метод draw() будет двигать фигуру на холсте (Canvas) — см. Прыг-скок. Canvas — область на экране, куда tkinter рисует фигуры.


Упражнения из книги

  • Жирафий танец — методы left_foot_forward, right_foot_back и общий dance(), который их вызывает
  • Черепашьи вилы — четыре Pen(), четыре независимые линии от одной точки

Связанные материалы