Создайте класс, который хранит словарь и устанавливает свойства объекта при изменении значения словаря в Python 3

1

У меня есть словарь:

Feedback = {'TV1power' : 0, 'TV2power' : 0, 'TV3power' : 0}

Когда TV1power равно 1, я хочу изменить свойство объекта, т.е. Powerbutton.SetState(1)

Я играл со следующим, но не имел большой удачи, поскольку я довольно новичок в python:

FeedbackDict = {'TV1power' : 0, 'TV2power' : 0, 'TV3power' : 0}

class Feedback(object):
    def __setattr__(self, name, value): 
        object.__setattr__(self, name, value) 
        if name == 'TV1power': 
            if value == 1:
                Powerbutton.SetState(1)
                FeedbackDict[name] = 1

TVFeedback = Feedback()
TVFeedback.TV1power = 1

Я знаю, что должен быть лучший способ хранить словарь в классе и при изменении значения сделать что-то.

  • 0
    Какой у Вас вопрос?
  • 0
    @DYZ почти уверен, что ему нужен метод, который обновляет значение в своем словаре, я просто не уверен, что такое name и value , так как он создает TVFeedback ни с TVFeedback
Показать ещё 5 комментариев
Теги:
python-3.x

1 ответ

0
Лучший ответ

Вы не сможете избавиться от наличия лишнего кода для каждого типа отзывов, но если аргументы будут согласованы, вы можете разделить сами типы отзывов на что-то подобное.

FEEDBACK_SETTINGS = {
    "tv_1_power" : {
        "default": 0,
        "callable":  print,
    },
    # ...
}


class Feedback(object):
    tv_1_power = None
    # ...

    def __init__(self):
        for name, info in FEEDBACK_SETTINGS.items():
            self.__setattr__(name, info["default"])

    def __setattr__(self, name, value):
        super().__setattr__(name, value)
        FEEDBACK_SETTINGS[name]["callable"](value)

feedback = Feedback()
feedback.tv_1_power = 1

В этом случае у вас есть Powerbutton.SetState как вызываемый для настроек tv_*_power. Я оставил это, поэтому это будет рабочий, управляемый пример; таким образом вы можете увидеть, что он вызывает print когда он устанавливает это значение при создании экземпляра, а затем снова, когда он устанавливается вручную.

Изменение: обновлено, чтобы обеспечить читаемость и проверку/завершение IDE за счет повторения себя, определяя настройки как в dict, так и в классе.

  • 0
    Это именно то, о чем я думал! Теперь мне не нужно иметь кучу операторов elif или if в моем классе, проверяющих каждое имя устройства. Большое спасибо! Это поможет, так как иногда у меня будет более 30 устройств с несколькими состояниями для отслеживания для каждого устройства.
  • 0
    Должен ли я объявить каждый объект как ни один и сделать инициализацию ? Если я не сделаю, они просто будут созданы, как я их установил?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню