我尝试构建一个包含多个框架的gui,它们应该都访问并与同一Model实例进行交互。因此,我创建一个Controller实例ctrl
,该实例将传递到每个帧。
不是在每次模型交互中都使用self.ctrl.model
,而是在帧初始化期间引入了self.model = self.ctrl.model
以提高可读性。到目前为止,对于模型中的所有更改,这都可以正常工作,即将所有更改传播到控制器和所有其他框架。但是,一个应用程序需要重新实例化该模型。当变量通过赋值传递时,重新实例化会导致一个新的Model()
实例,该实例在特定帧中分配给self.model
,从而使其与self.ctrl.model
分离。重新实例化模型以使所有更改都传播到Controller和其他框架的最佳方法是什么?
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
我想出两种可能的方法来获得所需的行为,但是可能会有其他/更明智的更改:
self.ctrl.model
引用模型self.ctrl.model = Model()
进行重新实例化,并在每帧中引入新的init_model()
方法,从而再次设置self.model = self.ctrl.model
,以便可以像以前一样使用缩写self.model
我认为完成您想要的目标的一种美方法是使用吸气剂和吸气剂。示例:
class Model:
def __init__(self):
pass
class Controller:
def __init__(self, model):
self.model = model
class Frame:
def __init__(self, controller):
self.controller = controller
self.model = controller.model
@property
def model(self):
return self.__model
@model.setter
def model(self, model):
self.__model = model
self.controller.model = model
controller = Controller(Model())
frame = Frame(controller)
print (id(frame.model), id(frame.controller.model))
frame.model = Model()
print (id(frame.model), id(frame.controller.model))