У меня есть аппаратное обеспечение. Я пишу класс, для которого есть несколько входов. Каждый вход (канал) имеет имя, поэтому я создал список:Создать свойства в классе из списка/атрибута в __init__
CHANNELS = {"T0": 0, "Tend": 1, "A": 2, "B": 3, "C" : 4, "D" : 5,
"E" : 6, "F" : 7, "G" : 8, "H" : 9}
Теперь я хотел бы создать свойство для доступа к значению каждого канала:
@property
def readT0(self)
return self._query("REQUEST STRING 0")
# the request string expects a number, instead of the real name T0
@property
def readTend(self)
return self._query("REQUEST STRING 1")
и т.д.
я предпочел бы сделать что-то вроде этого (меньше исходного кода):
def read(self, channel)
return self._query("REQUEST STRING %s" % channel)
и использовать какое-то перевод, чтобы создать Атрибуты:
def __init__ bla bla:
bla bla
for x in CHANNELS:
setattr(self, "read" + str(x), self.read(CHANNELS[x])
так
class.readA # channel A value: 10
> 10
class.readT0 # channel T0 value: 0.11
> 0.11
Таким образом, если аппаратное обеспечение использует больше каналов, я могу просто добавить к CHANNELS
словаря. Или есть лучший способ?
Поскольку я только хочу читать ценности, я бы остановился здесь. Но есть ли способ сочетать это с сеттера?
редактировать:
Я должен уточнить: я не хочу, чтобы изменить словарь или получить доступ к значениям словаря во время выполнения, я хочу, чтобы использовать его при создании класса для создания нескольких атрибутов для аппаратного обеспечения для прочитайте аппаратные значения.
Аппаратное обеспечение - это АЦП с каналами. Я могу прочитать значение АЦП каждого канала с
someclass._query("REQUEST STRING i")
# i is the channel number and returns the ADC value (e.g. 10.45 V)
Почему вы хотите «читать» там? Разве 'class.A0' не был бы более аккуратным? Как '_query' соответствует словарю? – jonrsharpe
Привет, 'class.T0' или' class.A' действительно был бы более аккуратным, но каналы имеют разные свойства, поэтому 'read' вполне может измениться на' class.delayT0' и 'class.offsetT0' ... Don ' t знать, что вы подразумеваете под соответствием: '_query()' является функцией com для чтения с аппаратного обеспечения. – Wolf82
не используют свойства для чего-то, что имеет побочный эффект, это ужасно, вместо этого используйте методы. Помните [zen of python] (https://www.python.org/dev/peps/pep-0020/): явное лучше, чем неявное. Свойство предназначено для скрытия небольшой операции над атрибутом, а не для маскировки дорогостоящего метода в простом атрибуте. –