10.5. Самостоятельная работа

Примечание

При выполнении заданий используйте заготовки решений: -> Репозиторий.

Подробнее: см. Цикл выполнения и защиты заданий.

Предупреждение

В данном разделе НЕ должны использоваться сторонние модули для реализации заданной функциональности. Например, при реализации класса Дата не нужно использовать готовый модуль datetime и т.д.

10.5.1. Простой класс

Выберите класс под номером ЦИФРА_СБ + 1 (Таблица 10.5.1).

Таблица 10.5.1 - Классы и их описание (простой класс)

№ п/п

Наименование класса

Описание

1

Vector

Геометрический вектор на плоскости

2

LineSegment

Математический интервал

3

Complex

Комплексное число

4

Time

Время

5

DateTime

Дата/Время

6

Money

Денежная единица

7

Stack

Стек

8

Queue

Очередь

9

Date

Дата

10

Fraction

Обыкновенная дробь

Прежде чем перейти к написанию кода:

  • изучите предметную область объекта и доступные операции;

  • для каждого поля и метода продумайте его область видимости, а также необходимость использования свойств.

При реализации класс должен содержать:

  • специальные методы:

    • __init__(self, ...) - инициализация с необходимыми параметрами;

    • __str__(self) - представление объекта в удобном для человека виде;

    • специальные методы для возможности сложения, разности и прочих операций, которые класс должен поддерживать;

  • методы класса:

    • from_string(cls, str_value) - создает объект на основании строки str_value;

  • поля, методы, свойства:

    • поля, необходимые для выбранного класса;

    • метод save(self, filename) - сохраняет объект в JSON-файл filename;

    • метод load(self, filename) - загружает объект из JSON-файла filename;

    • прочие методы (не менее 3-х) и свойства, выявленные на этапе изучения класса.

Реализуйте класс в отдельном модуле, а также создайте main.py, который бы тестировал все его возможности.

10.5.2. Класс-контейнер

Создайте класс-контейнер, который будет содержать набор объектов из предыдущей задачи. Например, класс VectorCollection будет содержать объекты класса Vector.

Для класса-контейнера предусмотрите:

  • специальные методы:

    • __init__(self, ...) - инициализация с необходимыми параметрами;

    • __str__(self) - представление объекта в удобном для человека виде;

    • __getitem__() - индексация и срез для класса-контейнера.

  • поля, методы, свойства:

    • поле _data - содержит набор данных;

    • метод add(self, value) - добавляет элемент value в контейнер;

    • метод remove(self, index) - удаляет элемент из контейнера по индексу index;

    • метод save(self, filename) - сохраняет объект в JSON-файл filename;

    • метод load(self, filename) - загружает объект из JSON-файла filename.

10.5.3. Иерархия классов

Выберите вариант под номером (ЦИФРА_СБ % 5) + 1 (Таблица 10.5.2).

Таблица 10.5.2 - Иерархия классов

№ п/п

Классы

Методы базового класса

1

Плеер, АудиоПлеер, ВидеоПлеер, DvdПлеер

запустить(), остановить()

2

ПищущаяПринадлежность, Карандаш, Ручка, ГелеваяРучка

писать()

3

ТранспортноеСредство, ВодноеТС, КолесноеТС, Автомобиль

ехать()

4

ДенежныйПеревод, ПочтовыйПеревод, БанковскийПеревод, ВалютныйПеревод

выполнить()

5

ПроезднойБилет, БезлимитныйБилет, БилетСОграничением, БилетСОграничениемПоездок

списать_поездку()

Далее:

  • выстройте классы в иерархию, продумайте их общие и отличительные характеристики и действия;

  • добавьте собственную реализацию методов базового класса в каждый из классов, предусмотрев:

    • необходимые параметры для базовых методов (например, в метод воспроизведения в Dvd-плеере можно передать абстрактный DVD-диск);

    • необходимые поля для функционирования базовых методов (например, при остановке Dvd-плеера имеет смысл сохранить текущую позицию воспроизведения); классы должны содержать как минимум по одному общедоступному, не общедоступному и закрытому полю/методу;

    • вывод на экран работы метода (например, вызов метода остановки в Dvd-плеере должен сообщать на экране, что плеер установлен на определенной позиции).

  • по желанию добавьте собственные методы в классы иерархии.

Реализуйте все классы в отдельном модуле, а также создайте main.py, который бы тестировал все его возможности.

По согласованию иерархия может быть расширена или выбрана самостоятельная индивидуальная тема для данной задачи.