Композиция объекта Python - доступ к методу из класса, который его вызвал - PullRequest
1 голос
/ 22 марта 2012

Вы должны простить меня, я пытаюсь научить себя ОО, но я столкнулся с этой проблемой с композицией и отношениями "есть".

class Main(object):
    def A(self):
        print 'Hello'
    def B(self):
        self.feature = DoSomething()

class DoSomething(object):
    def ModifyMain(self):
        #Not sure what goes here... something like
        Main.A()

def run():
    M = Main()
    M.B()

Реальным примером вышеуказанного упрощения является приложение PySide, где Main - это MainWindow, а DoSomething - динамически создаваемый виджет, который размещается где-то в окне. Я бы хотел, чтобы DoSomething мог изменять строку состояния главного окна, которое по сути вызывает (в Main) self.statusbar ().

Если в PySide есть ярлык для этого, Tops !! пожалуйста, дай мне знать! Тем не менее, я на самом деле ищу более общий Pythonic способ сделать это.

Я думаю, что я близко ... Я просто не могу заставить это работать ...

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Почему вы не используете вместо этого сигнал и слот? Это более Qt и ООП способ сделать это.

В вашем динамически созданном классе виджетов:

self.modifyMain = QtCore.Signal(str)

В вашем основном классе:

@QtCore.Slot(str)
def changeStatusbar(self, newmessage):
    statusBar().showMessage(newmessage)

в вашем основном классе после создания вашего виджета:

doSomething.modifyMain.connect(self.changeStatusbar)

А в вашем классе виджетов, где вы хотите изменить строку состояния главного, вы говорите:

modifyMain.emit("Hello")

Ничего из этого не проверено, поскольку у меня нет удобной установки PySide.

1 голос
/ 22 марта 2012

Есть две проблемы с вашим кодом:

  1. Вы никогда не звоните ModifyMain; и
  2. Main.A() приведет к ошибке, поскольку A - это метод экземпляра, но вы вызываете его для класса .

Вы хотите что-то вроде:

class Main(object):
    def A(self):
        print 'Hello'
    def B(self):
        self.feature = DoSomething() # self.feature is an instance of DoSomething
        self.feature.ModifyMain(self) # pass self to a method

class DoSomething(object):
    def ModifyMain(self, main): # note that self is *this* object; main is the object passed in, which was self in the caller
        #Note case - main, not Main
        main.A()

def run():
    M = Main()
    M.B()

if __name__=="__main__": # this will be true if this script is run from the shell OR pasted into the interpreter
    run()

Все ваши имена попирают обычные соглашения Python, которые можно найти в PEP8 , который является довольно хорошим руководством по стилю Python. Я оставил их, как они были в вашем коде, но не копируйте стиль в этом примере - следуйте PEP8.

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