🏠 Обзорный мини-проект

Summary session не содержит отдельного задания в LMS. Выполните обзорный мини-проект, чтобы закрепить абстрактные классы, пользовательские исключения и магические методы.

⚡ Кратко

Выполните обязательную часть домашнего задания, проверьте код на нескольких входных данных и только затем переходите к дополнительным задачам.

Задание 1. Фигуры и площади

Создайте абстрактный класс Shape.

  • В классе должен быть метод area(), который возвращает площадь фигуры.
  • Реализуйте два класса:
    • Circle — принимает радиус.
    • Rectangle — принимает ширину и высоту.

Задание 2. Проверка размеров фигур

Доработайте фигуры из предыдущего задания:

  • Добавьте проверку в конструкторы Circle и Rectangle, чтобы значения были положительными.
  • Если передано отрицательное или нулевое значение, выбрасывайте пользовательское исключение InvalidSizeError.

Задание 3. Электронное письмо

Реализуйте класс Email, который представляет электронное письмо. Каждое письмо должно содержать:

  • sender — адрес отправителя;
  • recipient — адрес получателя;
  • subject — тема письма;
  • body — текст письма;
  • date — дата отправки.

Класс должен поддерживать:

  • сравнение писем по дате;
  • преобразование письма в строку;
  • получение длины текста письма через len();
  • проверку на наличие текста: bool(email) равно False, если текст пустой или состоит только из пробелов.
from datetime import datetime

e1 = Email("alice@example.com", "bob@example.com",
           "Meeting", "Let's meet at 10am", datetime(2024, 6, 10))
e2 = Email("bob@example.com", "alice@example.com",
           "Report", "", datetime(2024, 6, 11))

print(e1)
print("Length:", len(e1))
print("Has text:", bool(e1))
print("Is newer:", e2 > e1)

Задание 4. Класс для работы с деньгами

Создайте класс Money, в котором:

  • можно складывать и вычитать объекты через операторы + и -;
  • объект выводится как строка в виде $<amount>;
  • при сложении и вычитании возвращается новый объект;
  • если вычитание приводит к отрицательному значению — вернуть объект с суммой 0.
money1 = Money(100)
money2 = Money(50)
print(money1 + money2)
print(money1 - money2)
print(money2 - money1)

Ожидаемый вывод:

$150
$50
$0