11.11 Наследование и исключения
TODO чуть побольше тем (есть минут десять)
Перегрузка операций
Пример с __add__/__radd__
Наследование
Попробуем унаследоваться от str и добавить туда унарный - (который будет переворачивать строку)
В чём проблема?
Как эта проблема решена в collections.UserString (см. тут)
Задача_1:
- Написать классы для комплексного числа, умеющие сравнивать на "меньше" и умножать.
написать класс OrderedComplex - наследник complex, добавляющий операцию сравнения "<" (метод __lt__(self,other))
логика сравнения: (x,y)<(u,v) <=> (x<u and y<v)
написать класс OrderedComplexMul - наследник OrderedComplex, добавляющий операцию скалярного произведения "@" (метод __matmul__(self,other))
логика операции: (x,y)@(u,v)=x·u+y·v
- Не требуется выполнять преобразование всех родительских методов к дочернему типу
- Поскольку это задача типа написать «класс/функцию», тесты для неё — это куски кода для обоих классов
Input:
A, B = OrderedComplex(1, -5), OrderedComplexMul(10, 15) print(A<B, B@B)
Output:
True 325.0
- Написать классы для комплексного числа, умеющие сравнивать на "меньше" и умножать.
Исключения
Программа, которая заставляет человека вводить число до тех пор, пока он не введёт число
Задача_2:
Написать программу, которая заставляет человека вводить координаты вершин треугольника в формате (x1, y1), (x2, y2), (x3, y3), до тех пор, пока это не окажутся координаты вершин треугольника в указанном формате, а потом выводит его площадь с точностью до сотой.
Если формат ввода неправильный, программа вместо площади выводит «Invalid input», а если формат условно правильный, но площадь его нулевая или вычислить её нельзя, потому что введены вообще не числа — «Not a triangle».
Диагностика ввода и расчет площади производится в функции triangleSquare, которая:
- получает на вход входную строку программы
преобразует строку в координаты вершин: (x1, y1), (x2, y2), (x3, y3) = eval(inStr)
при преобразовании ловит все исключения, и при любом перехваченном исключении формирует исключение InvalidInput (этот класс нужно определить)
если ввод корректен, выполняет проверку на то, что координаты - корректны для треугольника; в случае некорректности формирует исключение BadTriangle (этот класс нужно определить)
- если координаты корректны, то вычисляет и возвращает площадь
При вызове функции triangleSquare в основном коде программы ловятся исключения InvalidInput и BadTriangle, и в блоках их обработки выдается соответствующая диагностика
Вывод площади выполняется в блоке else
- Написать тесты:
- на неправильный формат
- на не-треугольник
Input:
asdf 1,2,3,4,5,6 (1,1), (2,2), (11,11) (1,2), (4,5), (9,8)
Output:
Invalid input Invalid input Not a triangle 3.00
Д/З
TODO доделать