2012-06-29 3 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 

Теперь это просто пример сценария, потому что я уже знаю, что это не будет работать, но это показывает, что им, по существу пытается сделать. Позвольте пояснить:

Я хочу получить и установить некоторые переменные из класса приложения. Я хочу, чтобы это можно было сделать из моего класса «SetModes». Проблема в том, что я не могу сделать экземпляр из него, потому что я не могу назначить родителя экземпляру, поэтому метод self.GetModes не работает. Он сообщает мне, что либо экземпляр не может «НЕ» иметь родителя, поэтому означает ли это, что я не могу создать экземпляр класса App, если все, что я хочу сделать, это использовать некоторые из его переменных и функций ?.

Так как я могу заставить это работать. Можно ли связать класс с классом, который требует родителя?

ответ

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без a App экземпляр? Если нет, можете ли вы включить логику SetModesApp? Если да, то кодирование SetModes для явного рассмотрения App - плохой дизайн.

Используя PubSub, вы отправляете запрос от SetModes. видит сообщение и может отправить ответное сообщение, которое видно по SetModes. Полностью отдельный, полностью асинхронный. SetModes ничего не нужно знать о App, только форматы сообщений.

Смежные вопросы