2012-06-29 24 views
0

这里的情况是我如何让课程彼此交谈?

class App(wx.Frame): 
    def __init__(self,parent,id=-1,title='Test App'): 
     wx.Frame.__init__(self,parent,id,title,size=((1050,690))) 

     self.mode = 'Test' 


class SetModes: 
    def __init__(self): 
     self.GetModes = App(None,-1) 

     self.appmode = '' 

    def SetMode(self): 
     self.appmode = self.GetModes.mode 

现在这只是一个示例脚本,因为我已经知道这不会工作,但它说明了什么IM基本上要怎样做。让我澄清:

我想从应用程序类获取和设置一些变量。我希望能够从我的'SetModes'类中做到这一点。问题是我无法创建它的一个实例,因为我无法为实例指定父项,所以self.GetModes方法不起作用,它告诉我实例不能'不'有父项,所以这是否意味着我不能创建我的应用程序类的实例,如果我想要做的就是使用它的一些变量和函数。

那么如何让这个工作。我可以让班级与需要家长的班级进行沟通吗?

回答

0

仅仅因为wx.Frame需要父项,并不意味着您无法在另一个未关联的类中为其分配引用。只要家长您的应用实例的东西,你通常会做,但在你的SetModes通过参考:

app = App(parent) 
setModes = SetModes() 
setModes.GetModes = app 

这归结为一个设计问题与您的程序。窗口小部件需要父母。

+0

我承认这是一个设计问题。但我对此感到困惑。我看到你将App类分配给变量'app',但是当我的应用程序类需要父类时,这是如何工作的。如果你可以工作我的代码,以适应你的建议,我会很感激它。看到我的代码更正将帮助我以后参考。 – Isov5

+0

我会检查出其他答案。由于我不知道你的代码意图是什么,所以我的意见有点宽泛。 – jdi

1

我觉得你的问题的一部分是,框架必须从wx.App实例内部初始化,然后MainLoop()必须被调用(见this tutorial注意框架如何有父None)。

之后,像jdi的解决方案将工作。不过,如果我可以避免使用引用,我仍然不喜欢。对于直接孩子的父母调用函数,没关系,但我个人的规则是,我的班级看不到他们没有直接拥有的任何对象(即没有关于儿童孩子的知识)。

我是PubSub的忠实粉丝,用于在无关的类之间进行通信。与wx.Event对象不同,不需要任何社会关系。与jdi提出的参考解决方案不同,不需要任何类别对任何其他结构有任何了解。

问题是,在您的应用程序中,是否可以存在SetModes实例而没有App实例?如果不是,你能把SetModes的逻辑合并到App吗?如果是,那么编码SetModes明确处理App是坏设计。

使用PubSub,您发送SetModes的请求消息。 App看到该消息,然后可以发送一条响应消息,该消息见SetModes。完全分开,完全异步。 SetModes不需要知道任何关于App,只是消息格式。