В финальной части курса закрепим изученный материал, создав еще одну небольшую программу на Python с использованием концепций ООП.

Предварительный этап проектирования имеет большое значение в объектно-ориентированном программировании. В рамках всего процесса разработки можно выделить основные этапы:

  1. Формирование задачи.
  2. Идентификация объектов, которые участвуют в ее решении.
  3. Проектирование классов, которые послужат основой для создания объектов, и, при необходимости, установление наследственных связей между ними.
  4. Определение основных свойств и методов, которые необходимы объектам для выполнения задачи.
  5. Создание классов с их полями и методами.
  6. Генерация объектов.
  7. Организация взаимодействия объектов для решения задачи.

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

Можно выделить три необходимых класса – "учитель", "ученик" и "данные". Поскольку и учитель, и ученик представляют собой людей, их можно объединить в надкласс "человек". Однако в рамках этой задачи у них, вероятно, не будет общих атрибутов.

Ниже представлены способности, которые нужны объектам для решения задачи "увеличение знания":

  • Ученик должен иметь возможность получать информацию и преобразовывать её в собственные знания.
  • Учитель должен быть способен обучать группу учеников.
  • Данные могут служить перечнем знаний, откуда элементы извлекаются по индексу.
class Data:
    def __init__(self, *info):
        self.info = list(info)
    def __getitem__(self, i):
        return self.info[i]

class Teacher:
    def teach(self, info, *pupil):
        for i in pupil:
            i.take(info)

class Pupil:
    def __init__(self):
        self.knowledge = []
    def take(self, info):
        self.knowledge.append(info)

Давайте посмотрим, как взаимодействуют между собой объекты этих классов:

>>> from test import *
>>> lesson = Data('class', 'object', 'inheritance', 'polymorphism', 'encapsulation')
>>> marIvanna = Teacher()
>>> vasy = Pupil()
>>> pety = Pupil()
>>> marIvanna.teach(lesson[2], vasy, pety)
>>> marIvanna.teach(lesson[0], pety)
>>> vasy.knowledge
['inheritance']
>>> pety.knowledge
['inheritance', 'class']

Практическая работа

Возможно ли, что ученик сможет учиться без помощи учителя в этой программе? Если так, попробуйте научить его чему-то самостоятельно.

Добавьте в класс Pupil метод, который позволит ученику случайным образом "забывать" часть своих знаний.

Вопросы для самопроверки:

  1. Какие основные этапы разработки выделяются в объектно-ориентированном программировании?