Пример объектно-ориентированной программы на Python
В конце курса закрепим пройденный материал, написав еще одну небольшую объектно-ориентированную программу на Python.
В ООП очень важно предварительное проектирование. В общей сложности можно выделить следующие этапы разработки объектно-ориентированной программы:
-
Формулирование задачи.
-
Определение объектов, участвующих в ее решении.
-
Проектирование классов, на основе которых будут создаваться объекты. В случае необходимости установление между классами наследственных связей.
-
Определение ключевых для данной задачи свойств и методов объектов.
-
Создание классов, определение их полей и методов.
-
Создание объектов.
-
Решение задачи путем организации взаимодействия объектов.
Пусть необходимо разработать виртуальную модель процесса обучения. В программе должны быть объекты-ученики, учитель, кладезь знаний.
Потребуется три класса – "учитель", "ученик", "данные". Учитель и ученик во многом похожи, оба – люди. Значит, их классы могут принадлежать одному надклассу "человек". Однако в контексте данной задачи у учителя и ученика вряд ли найдутся общие атрибуты.
Определим, что должны уметь объекты для решения задачи "увеличить знания":
-
Ученик должен уметь брать информацию и превращать ее в свои знания.
-
Учитель должен уметь учить группу учеников.
-
Данные могут представлять собой список знаний. Элементы будут извлекаться по индексу.
class Data: def __init__(self, *info): self.info = list(info) def __getitem__(self, i): return self.info[i] class Teacher: def __init__(self): self.work = 0 def teach(self, info, *pupil): for i in pupil: i.take(info) self.work += 1 class Pupil: def __init__(self): self.knowledge = [] def take(self, info): self.knowledge.append(info)
В класс Teacher также добавлено свойство экземпляров work, чтобы подсчитывать количество проделанной учителем работы.
Теперь посмотрим, как объекты этих классов могут взаимодействовать между собой:
>>> 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 метод, позволяющий ученику случайно "забывать" какую-нибудь часть своих знаний.
Курс с примерами решений практических работ:
pdf-версия