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

2 投票
3 回答
2095 浏览
提问于 2025-04-16 10:09

有很多问题和这个类似,但没有一个答案能完全解决我的困惑,所以请耐心听我说。

我正在努力学习用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

在这里有一些很不错的示例代码,展示了如何在wxPython中应用MVC模型。你可以在这个链接找到它:http://wiki.wxpython.org/ModelViewController

2

这个问题的通用解决方案叫做 模型-视图-控制器

模型就是你想展示的数据的一个表示,在你的情况下,就是文本角色扮演游戏的状态。视图是负责在屏幕上实际显示内容的部分。它从模型那里获取要显示的数据。控制器则处理所有输入和其他会改变数据和视图的事件。这样一来,哪个对象需要知道什么就变得很清楚了。

6

你似乎有几个误解。

  1. 确实在这里使用方法。(你是想说“函数”,也就是不属于某个类的那种吗?)

  2. 类并不是某种功能的容器或命名空间。它们定义了一种数据类型。有一个WebParser类的意义在于,你可以有多个WebParser

  3. 在Python中,类也是对象。现在,你并没有让TheParser成为一个WebParser;你只是把它当作这个类本身的别名。换句话说,TheParser现在大致等于“网页解析器的概念”。

  4. 传递参数并不是“毫无意义”;这是在函数之间传递信息的方式。你通常不会直接传递类,而是传递类的实例。无论你是否使用类,你都会面临基本相同的沟通问题。

解决这个问题非常简单。首先,需要创建WebParser,所以我们通过它的构造函数来处理这个。接下来,我们的TheGUI实例(顺便说一下,这个名字不太好 - “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()

撰写回答