Модули и классы
Долги за прошлую лекцию
Разбор какой-нибудь задачи ../05_ExceptionsGenerators
- Предупредить о «парковке на слух»
Организация модуля
- Поиск модуля: Кеш → finder → loader;
finder по умолчанию: sys.path
__import__()
- Выполнение кода при загрузке модуля и при запуске его
- Любой файл на Python — модуль
__name__ == "__main__"
.pyc и .pyo
Пакеты: __init__.py
Подпакеты, __all__ для указания пакетов при импорте *
относительный import (имя модуля: .*name)
- Строка документации
Классы и объекты
JT
Объектное планирование и поддержка объектов со стороны языка.
- объектно-ориентированный ЯП
-
- модульность
- инкапсуляция
- наследование
- полиморфизм
Классы — конструкторы объектов
Неожиданная статья про классы.
- Класс: алгоритм создания объекта
- Поля класса и поля объекта
- Динамика создания полей
- Правило видимости
- Методы
Вызов метода: первый параметр — сам объект (self)
__init__(): когда вызывается
- Напоминание о динамической типизаций
- Строка документации
Перегрузка стандартных операций
- Любая (?) операция — «синтаксический сахар» вокруг метода
Обзор спецметодов:
__repr__(), __str__()
Сравнения, __nonzero__()
__*attr__()
Контейнеры (__*item()__) и последовательности (__*slice__())
- Арифметические операции
r-версии операций
i-версии операций
- …
- Мутное замечание насчёт old/new style, в частности, добычи спецметода
Оформление домашних заданий для объектного тестирования
Задание — модуль (по имени mod.py), тест — проверяющий код на Python (начинается с оператора import mod)
Использование unittest.html
Д/З
- Прочитать:
Про модули в учебнике (modules.html
Про классы в учебнике (classes.html)
Про спецметоды в справочнике ( или пока не читайте про метаклассы, или берегите мозг! вас предупредили!)
(CompareFields) Сравнение полей
Реализовать класс Comparator, содержащий только поле value и метод compare, возвращающий результат сравнения value с полем value любого другого объекта (аналогичный работе стандартной функции cmp()). Если такого поля нет, метод возвращает 1.
-1
(SimpleVector) Вектора на плоскости
Реализовать класс Vector, позволяющий
- задавать двумерный вектор (из двух чисел)
- вычислять вектор — сумму двух векторов
- вычислять вектор — результат умножения вектора на число (или числа на вектор)
- скалярно умножать вектор на вектор
преобразовывать вектор в строку вида |x,y|
|1,2| |4,6| 11 |7,14|
(PrimitiveDot) Точки в N-мерном пространстве
Реализовать клаcc Dot, позволяющий:
Задавать точку в N-мерном пространстве (с помощью N чисел, где N>0)
Преобразовывать точку в строку вида «X1,X2,…,XN»
Вычислять расстояние (distance()) между двумя точками пространства одинаковой размерности
Вычислять точку (middle()) — середину отрезка между двумя точками пространства одинаковой размерности
При попытке работы с такими же точками пространства, но разной размерности порождать исключение ValueError
1,2,3 3.464 2.0,3.0,4.0 1,2 ERROR
Реализовать класс Vovel, у объекта которого можно получить значение любого поля, если имя этого поля состоит только из маленьких гласных латинских букв. Значение это — строка, совпадающая с именем поля, только состоящая из больших латинских букв. В противном случае поведение объекта должно быть естественным (вызывть исключение AttributeError, как минимум с тем же сообщением, что и «естественный» AttributeError в случае несуществующего поля). Реализовывать что-то, кроме получения значения поля, не надо.
A = mod.Vovel() print A.aoao try: print A.field except AttributeError, msg: print "ERROR",msg
AOAO ERROR Vovel instance has no attribute 'field'