Могу ли я создать Enum экземпляров класса данных?Python

Программы на Python
Ответить
Anonymous
 Могу ли я создать Enum экземпляров класса данных?

Сообщение Anonymous »

У меня есть фиксированный набор из трех датчиков, которые я хочу смоделировать как перечисление. Каждый из этих датчиков параметризуется несколькими различными атрибутами. Поэтому я хочу смоделировать сами датчики как класс данных.
Моя наивная попытка выглядит примерно так:

Код: Выделить всё

@dataclass
class SensorLocation:
address: int
pins: int
other_details: ...

class Sensors(SensorLocation, Enum):
TOP_SENSOR = SensorLocation(address=0x10, pins=0xf,  other_details=...)
BOTTOM_SENSOR = SensorLocation(address=0x10, pins=0xf0,  other_details=...)
SIDE_SENSOR = SensorLocation(address=0x15, pins=0xf,  other_details=...)
Я ожидаю, что по сути это должно создать перечисление, экземпляры которого будут вести себя как экземпляры SensorLocation. Это делает типы более понятными и размещает методы там, где я ожидал.
Однако при создании перечисления это не удается и возникает ошибка:

Код: Выделить всё

Traceback (most recent call last):
File "", line 1, in 
File "/path/to/python/3.7.10/lib/python3.7/enum.py", line 232, in __new__
enum_member.__init__(*args)
File "", line 3, in __init__
File "/path/to/python/3.7.10/lib/python3.7/types.py", line 175, in __set__
raise AttributeError("can't set attribute")
AttributeError: can't set attribute
Что я могу сделать, так это удалить подкласс SensorLocation в объявлении перечисления, но это означает, что при использовании MyPy или подобных инструментов я теряю некоторую возможность вводить подсказки правильных значений. . Это также усложняет доступ к фактическим значениям, но основная цель этого перечисления — предоставить доступ к этим значениям.
Есть ли способ обойти эту ошибку, которую я упускаю, или другое решение, которого я сейчас не вижу?

Подробнее здесь: https://stackoverflow.com/questions/709 ... -instances
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»