# Домашняя работа № 3 (9 p.) **Перед выполнением домашней работы вытяните и слейте изменения из моего оригинального репозитория** **Для тестирования вашего кода используйте существующие тесты из директории tests или добавьте свои** Для работы с устройствами в нашем SCADA-фреймворке мы определим класс `Device` который будет представлять интерфейс для произвольного прибора. Определим следующие понятия: * **trait** --- изменяемое свойство устройства, которое опционально может быть считано из устройства или наоборот записано в прибор. * **action** --- действие, которое может выполнить устройство. * **логический уровень** --- текущие значение traits устройства в программе. * **физические уровень** --- реальные значения trits устройства. Таким образом объект представляющий устройство описывает traits и actions этого устройств, а так же связывает физический и логический уровень. 1. (1 p.) В модуле `controls/device.py` превратите класс `DeviceLifecycleState` в перечисление, описывающий одно из трёх состояний прибора: `INIT`, `OPEN`, `CLOSE`. 2. (1 p.) В модуле `controls/device.py` в классе `Device` выполните следующий условия: 1. Сделайте класс `Device` абстрактным. 2. Методы `trait_descriptors` и `action_descriptors` сделайте abstract property. Считывание/запись данных с/в устройства/о можно проводить синхронным или асинхронным образом. Определим класс `SynchronyDevice` описывающий синхронное взаимодействие с устройством. В нем определенны абстрактные методы для работы с traits и actions устройства (см. docstring методов). 3. В модуле `equipment/turtle_device.py` реализуйте класс `TurtleDevice` (для генерации заготовок абстрактных методов можно использовать иструменты IDE). С помощью экземпляров этого класса мы будем управлять черепашкой (объектом класс `Turtle` из модуля `turtle`). Реализуйте следующее поведение: 1. (1 p.) В методах `open` и `close` должен создаваться и уничтожаться объект черепашки, не забудьте вызвать родительские методы для изменения состояния устройства. 2. (3 p.) Свойства `trait_descriptors` и `action_descriptors` должны возвращать описания traits и actions черепашки согласно заданной сигнатуре методов. Traits черепашки это её публичные аттрибуты и они доступны только на чтение. Actions черепашки это её публичные методы. Описания должны генерироваться автоматически путем анализа класса черепашки. 3. (3 p.) Реализуйте методы `read`, `write`, `execute`, `__getitem__`, `invalidate`. Значения полей объекта черепашка считайте физическим уровнем. При необходимости вызывайте реализацию родительского метода.