В финальной части курса закрепим изученный материал, создав еще одну небольшую программу на Python с использованием концепций ООП.
Предварительный этап проектирования имеет большое значение в объектно-ориентированном программировании. В рамках всего процесса разработки можно выделить основные этапы:
- Формирование задачи.
- Идентификация объектов, которые участвуют в ее решении.
- Проектирование классов, которые послужат основой для создания объектов, и, при необходимости, установление наследственных связей между ними.
- Определение основных свойств и методов, которые необходимы объектам для выполнения задачи.
- Создание классов с их полями и методами.
- Генерация объектов.
- Организация взаимодействия объектов для решения задачи.
Предположим, что нам нужно создать виртуальную модель учебного процесса. В программе следует предусмотреть объекты, такие как ученики, учитель и база знаний.
Можно выделить три необходимых класса – "учитель", "ученик" и "данные". Поскольку и учитель, и ученик представляют собой людей, их можно объединить в надкласс "человек". Однако в рамках этой задачи у них, вероятно, не будет общих атрибутов.
Ниже представлены способности, которые нужны объектам для решения задачи "увеличение знания":
- Ученик должен иметь возможность получать информацию и преобразовывать её в собственные знания.
- Учитель должен быть способен обучать группу учеников.
- Данные могут служить перечнем знаний, откуда элементы извлекаются по индексу.
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 метод, который позволит ученику случайным образом "забывать" часть своих знаний.