Как я могу обновить ссылки на объекты для изменяемых объектов?

#python #python-3.x #reference #state

#питон #python-3.x #ссылка #состояние

Вопрос:

Я пытаюсь управлять глобальным определением состояния между объектами с помощью чего-то вроде этого:

 APP_STATE = {"my_list":[1]}

class Widget1(object):
    def __init__(self, widget_id, shared_state):
        self.shared_state = shared_state
        shared_state[widget_id] = self

class Widget2(object):
    def __init__(self, widget_id, shared_state):
        self.shared_state = shared_state
        shared_state[widget_id] = self
        self.my_list = self.shared_state["my_list"]
   
class App(object):
    def __init__(self, state=APP_STATE):
        self.state = state
        self.widget1 = Widget1(widget_id="w1", shared_state=self.state)
        self.widget2 = Widget2(widget_id="w2", shared_state=self.state)


if __name__ == "__main__":
    
    app = App()
    # later...
    some_new_list = [1,2,3,4]
    app.state["my_list"] = some_new_list

    print(f"app.widget2.shared_state['my_list'] has been updated: {app.widget2.shared_state['my_list']}")
    print(f"but app.widget2.my_list retains a ref to the original list: {app.widget2.my_list}")
 

Как показано в __main__ , атрибут widget2.my_list не обновляется с помощью state dict .

Каков самый простой способ привязать атрибут, чтобы он всегда соответствовал значению state dict?

Я не хочу ссылаться my_list через dict, потому что он может быть глубоко вложенным и очень длинным / подробным для вызова. Хотя в этом случае я мог бы изменить список, это не вариант в «реальном» коде, поскольку желаемая замена может быть нелегко изменена по сравнению с оригиналом (например, создание экземпляра некоторого класса).

Комментарии:

1. Вы обновляете словарь, а не список в словаре.

2. self.my_list это ссылка на список из исходного словаря, замена словарной записи не обновляется self.my_list .

3. Выполняет ли nedbatchelder.com/text/names1.html помочь?

4. @Barmar ах да, хорошая мысль. Я думаю, я всегда мог бы привязать локальную переменную к состоянию dict везде, где это необходимо, например my_list = self.state["nested"]["dict"]["my_list"] . Я надеялся, что есть что-то немного более чистое, но приведенное выше в an @property — это все, о чем я могу думать

5. @KarlKnechtel спасибо за ссылку, я (думаю?) Я знаю, как python обрабатывает присвоение переменных… но это не сразу решает мою проблему