Python: вызов метода A из класса A в классе B? - PullRequest
2 голосов
/ 18 января 2011

Есть ряд вопросов, похожих на этот, но ни один из ответов не попадает в точку - поэтому, пожалуйста, потерпите меня.

Я стараюсь изо всех сил изучать ООП с помощью Python, но я продолжаюсталкиваюсь с ошибками (вроде этой), которые заставляют меня думать, что все это бессмысленно, и было бы проще просто использовать методы.

Вот мой код:

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 ]

6 голосов
/ 18 января 2011

У вас, кажется, есть несколько заблуждений.

  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()
2 голосов
/ 18 января 2011

Общий ответ на эту проблему называется Model View Controller .

Модель представляет собой представление данных, которые вы хотите представить, в вашем случае состояние текстовой RPG. Представление - это компонент, который обрабатывает фактический просмотр на экране. Он получает данные, которые он просматривает из модели. Контроллер обрабатывает все входные и другие события, которые изменяют данные и представление. Это позволяет понять, какой объект должен знать, какой.

0 голосов
/ 18 января 2011

Есть хороший пример кода модели MVC, примененный в wxPython на http://wiki.wxpython.org/ModelViewController

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...