Я пытаюсь создать gui, который включает в себя несколько кадров, которые должны иметь доступ и взаимодействовать с одним и тем же экземпляром модели. Поэтому я создаю экземпляр контроллера ctrl
, который передается каждому кадру.
Вместо использования self.ctrl.model
для каждого взаимодействия модели, я ввел self.model = self.ctrl.model
во время инициализации кадра, чтобы повысить удобочитаемость. До сих пор это работало нормально для всех изменений в модели, то есть все изменения были распространены на контроллер и все остальные кадры. Однако одно приложение требует повторного создания модели. Поскольку переменные передаются посредством присваивания, повторное создание приводит к новому экземпляру Model()
, который присваивается self.model
в указанном кадре c, оставляя его отсоединенным от self.ctrl.model
. Каков наилучший способ создания экземпляра модели так, чтобы все изменения распространялись на контроллер и другие кадры?
class Model():
def __init__(self):
self.par = "init"
class Controller():
def __init__(self):
self.model = Model()
def state(self):
print("ctrl | id:", id(self.model), "| par:", self.model.par)
class FrameA():
def __init__(self, parent, ctrl):
self.parent = parent
self.ctrl = ctrl
self.model = self.ctrl.model
def modify(self):
self.model.par = "modify"
print("frame | id:", id(self.model), "| par:", self.model.par)
def newmodel(self):
self.model = Model()
print("frame | id:", id(self.model), "| par:", self.model.par)
ctrl = Controller()
frameA = FrameA(None,ctrl)
ctrl.state()
frameA.modify()
ctrl.state() # changes in frameA propagate to ctrl
frameA.newmodel()
ctrl.state() # changes in frameA do not propagate to ctrl anymore
Вывод:
ctrl | id: 2040845455712 | par: init
frame | id: 2040845455712 | par: modify
ctrl | id: 2040845455712 | par: modify
frame | id: 2040845245128 | par: init
ctrl | id: 2040845455712 | par: modify