Python重新实例化共享控制器实例中的模型

问题描述 投票:1回答:2

我尝试构建一个包含多个框架的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
python reference controller parameter-passing
2个回答
1
投票

我想出两种可能的方法来获得所需的行为,但是可能会有其他/更明智的更改:

  • 不要偷懒,总是按self.ctrl.model引用模型
  • 参照控制器self.ctrl.model = Model()进行重新实例化,并在每帧中引入新的init_model()方法,从而再次设置self.model = self.ctrl.model,以便可以像以前一样使用缩写self.model

-1
投票

我认为完成您想要的目标的一种美方法是使用吸气剂和吸气剂。示例:

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))
© www.soinside.com 2019 - 2024. All rights reserved.