#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 обрабатывает присвоение переменных… но это не сразу решает мою проблему