Введение в объектно-ориентированное программирование (ООП)

Добро пожаловать в серию статей про объектно-ориентированное программирование (ООП). В этой статье мы представим концепцию ООП, которая будет так или иначе присутствовать во всех статьях данной серии. Многие преимущества ООП вы увидите практически сразу, но и в дальнейшем тоже будут приятные сюрпризы.

Объектно-ориентированное программирование сложно точно определить, но, как вы могли уже догадаться, оно связано с созданием объектов и с их взаимодействием друг с другом. У объектов есть характеристики и особенности (известные как атрибуты), и они могут делать различные вещи при помощи своих методов. Главное преимущество ООП состоит в возможности взаимодействия объектов друг с другом, а также в возможности их гибко изменять с течением времени. Это обстоятельство делает ООП очень удобным для разработчиков. Все приложения легко читаемы, масштабируемы и могут быть легко протестированы.

Мы счиатем, что понять ООП проще всего на практике, поэтому приступим к делу. Мы будем использовать библиотеку PyGame. Как правило, для ее установки вам достаточно выполнить команду pip install pygame, и все будет в порядке. Однако в Mac OS более веселая жизнь, и вам надо действовать по следующей инструкции или нагуглить что-нибудь еще.

Мы выбрали Pygame, потому что она дает нам простую возможность визуализировать все то, что мы создаем и делаем. Таким образом мы увидим наши объекты в действии. Мы собираемся построить Мир Клякс, то есть такой мир, где персонажи это кляксы. У разных клякс разные свойства, и все они должны взаимодействовать друг с другом в окружающей среде Мира Клякс. Итак, приступим!

Для создания объекта нам нужен класс, поэтому мы начнем с класса Blob. У объектов Python есть набор «специальных методов», часто называемых магическими. Наиболее распространенным является метод __init__, но мы рассмотрим и другие.

В методе __init__ мы указываем все то, что должно произойти с объектом при его инициализации. Каждый раз, когда кто-то задает переменную как объект класса Blob, запускается метод __init__.

Давайте заполним этот метод некоторой базовой информацией. Например, зададим начальное местоположение для большого двоичного объекта, который размером и цветом напоминает кляксу:

class Blob:
    
    def __init__(self, color):
        self.x = random.randrange(0, WIDTH)
        self.y = random.randrange(0, HEIGHT)
        self.size = random.randrange(4,8)
        self.color = color 

Метод __init__ имеет два аргумента: self и color.

Аргумент self можно назвать как угодно, но общепринятое соглашение предусматривает название self. Этот аргумент мы будем использовать, чтобы создавать атрибуты класса и получать к ним доступ. Делать мы это будем как внутри класса, так и вне его (тогда место self займет имя переменной данного объекта).

Аргумент color — это пока единственная наша переменная.

Теперь мы можем добавить и другие, обычные методы. Возможно, мы хотим, чтобы наши кляксы могли двигаться?

    def move(self):
        self.move_x = random.randrange(-1,2)
        self.move_y = random.randrange(-1,2)
        self.x += self.move_x
        self.y += self.move_y 

Идея заключается в том, что наш объект будет взаимодействовать в ограниченной среде с фиксированной шириной и высотой. Поэтому мы продолжим и добавим некоторую обработку на тот случай, если эта клякса выйдет за границы:

    def move(self):
        self.move_x = random.randrange(-1,2)
        self.move_y = random.randrange(-1,2)
        self.x += self.move_x
        self.y += self.move_y
        
        if self.x < 0: self.x = 0
        elif self.x > WIDTH: self.x = WIDTH
        
        if self.y < 0: self.y = 0
        elif self.y > HEIGHT: self.y = HEIGHT 

В следующей статье мы будем использовать PyGame для создания среды для нашего объекта.

Следующая статья — Введение в объектно ориентированное программирование: создание среды для нашего объекта с Pygame.