Python:在B类中调用A类的方法A?

时间:2011-01-17 23:50:30

标签: python oop class wxpython

有很多问题与此相似,但没有一个答案出现在现场 - 所以请耐心等待。

我正在努力学习使用Python的OOP,但我一直遇到错误(比如这个),这让我觉得这一切都毫无意义,而且只使用方法会更容易。

这是我的代码:

class TheGUI(wx.Frame):
    def __init__(self, title, size):
        wx.Frame.__init__(self, None, 1, title, size=size)

        # The GUI is made ...

        textbox.TextCtrl(panel1, 1, pos=(67,7), size=(150, 20))
        button1.Bind(wx.EVT_BUTTON, self.button1Click)

        self.Show(True) 

    def button1Click(self, event):
        #It needs to do the LoadThread function!

class WebParser:

    def LoadThread(self, thread_id):
        #It needs to get the contents of textbox!


TheGUI = TheGUI("Text RPG", (500,500))
TheParser = WebParser

TheApp.MainLoop()

所以我遇到的问题是GUI类需要使用WebParser类中的函数,而WebParser类需要从GUI类中存在的文本框中获取文本。

我知道我可以通过将对象作为参数传递来实现这一点,但这似乎完全没有意义,必须有一种更合乎逻辑的方法来实现这一点,不使用类看起来毫无意义?

提前致谢!

3 个答案:

答案 0 :(得分:6)

你似乎有几个误解。

  1. 在此使用方法。 (你的意思是“功能”,不属于一个类吗?)

  2. 类不是功能的某种容器或命名空间。他们定义数据类型。拥有WebParser类的关键是你可以拥有多个WebParser

  3. 在Python中,类也是对象。现在,你没有让TheParser成为WebParser;你正在使它成为类本身的别名。换句话说,TheParser现在或多或少等于“网络解析器的概念”。

  4. 传递参数不是“毫无意义”;这是你如何获得功能之间的信息。你没有(通常!)传递课程;你传递类的实例。无论您是否使用课程,您都会遇到基本相同的沟通问题。

  5. 解决这个问题非常简单。首先,需要创建WebParser,因此我们通过使用其构造函数来处理它。接下来,我们的TheGUI实例(一个可怜的名字btw - “the”并不真正属于)需要知道我们的实例,所以我们将它传递给构造函数。这样,实例可以保留对它的引用,并使用它来调用LoadThread方法。它还需要保留对textbox的引用,以便将此信息传递给LoadThread

    看起来像:

    class MyGUI(wx.Frame):
        def __init__(self, title, size, loader):
            wx.Frame.__init__(self, None, 1, title, size=size)
    
            # The GUI is made ...
    
            textbox.TextCtrl(panel1, 1, pos=(67,7), size=(150, 20))
            self.textbox = textbox
            button1.Bind(wx.EVT_BUTTON, self.button1Click)
            self.loader = loader
            self.Show(True) 
    
        def button1Click(self, event):
            self.loader.LoadThread(get_thread_id(), self.textbox)
    
    
    class WebParser:
        def LoadThread(self, thread_id, a_textbox):
            do_something_with(a_textbox)
    
    
    TheGUI = MyGUI("Text RPG", (500,500), WebParser())
    
    TheApp.MainLoop()
    

答案 1 :(得分:2)

该问题的一般答案称为Model View Controller

模型表示您要呈现的数据,在您的情况下是文本RPG的状态。视图是处理屏幕上实际查看的组件。它从模型中获取它所查看的数据。控制器处理更改数据和视图的所有输入和其他事件。这使得很清楚哪个对象需要知道哪个。

答案 2 :(得分:0)

http://wiki.wxpython.org/ModelViewController

的wxPython中应用了一些MVC模型的良好示例代码