В конце курса закрепим пройденный материал, написав еще одну небольшую объектно-ориентированную программу на 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 метод, позволяющий ученику случайно “забывать” какую-нибудь часть своих знаний.
Курс с примерами решений практических работ и всеми уроками:
android-приложение, pdf-версия
Источник:https://younglinux.info/