Пример объектно-ориентированной программы на Python

В конце курса закрепим пройденный материал, написав еще одну небольшую объектно-ориентированную программу на 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 метод, позволяющий ученику случайно "забывать" какую-нибудь часть своих знаний.

Курс с примерами решений практических работ: android-приложение, pdf-версия.

Комментарии

import random
class Data:
    def __init__(self, *info):
        self.info = list(info)
    def __getitem__(self, item):
        return self.info[item]
    def __len__(self):
        return len(self.info)
class Teacher:
    def teach(self, info, *pupil):
        for i in pupil:
            i.study(info)
class Pupil:
    def __init__(self):
        self.knowledge = []
    def study(self, info):
        self.knowledge.append(info)
    def forget(self):
        self.knowledge.remove(random.choice(self.knowledge))
 
lesson = Data('class', 'object', 'inheritance', 'polymorphism', 'encapsulation')
TFHirianov = Teacher()
usual1 = Pupil()
usual2 = Pupil()
solo = Pupil()
c = Pupil()
for n in range(len(lesson)):
    TFHirianov.teach(lesson[n], usual1, usual2)
solo.study(lesson[3])
print(solo.knowledge)
print(usual1.knowledge)
print(usual2.knowledge)
usual1.forget()
print(usual1.knowledge)