Как я могу условно создавать и использовать родительские классы в Python 3 - PullRequest
0 голосов
/ 01 мая 2018

Я создаю API, который я хотел бы использовать в приложениях, использующих pyqt и другие приложения. Если программист использует графический интерфейс, отличный от Qt, я не хочу, чтобы она импортировала pyqt и т. Д. Моя проблема в том, что я использую задачу, чтобы подписаться на сообщения и передать их основной задаче. Я выполняю это, передавая параметр (qt), который имеет значение True или False в зависимости от того, какой графический интерфейс мы реализуем. Затем я создаю класс, который генерирует класс SubscriberParent из QtCore.QThread или Thread. Конечная подпискаThread имеет тип SubscriberThreadParent. Основной поток либо опрашивает interTaskQueue, либо использует сигналы и слоты Qt для обработки сообщения.

    class Gui(object):
        def __init__(self, qt):
          if qt:
            from PyQt5 import QtCore
            from PyQt5.QtCore import Qt, pyqtSignal

            class SubScriberThreadParent(QtCore.QThread):
                def __init__(self):
                    QtCore.QThread.__init__(self)
          else:
                from threading import Thread

          class SubScriberThreadParent(Thread):
                def __init__(self):
                    Thread.__init__(self)


    class SubscriberThread(Gui.SubScriberThreadParent):


        def __init__(self, qt, dsParam, SubScriberThreadParent):

          if qt:
              from PyQt5 import QtCore
              from PyQt5.QtCore import Qt, pyqtSignal
              pubIn = pyqtSignal(str, str)


          SubScriberThreadParent.__init__(self)

          self.interTaskQueue = dsParam.interTaskQueue
          .
          .
          .
          .


        #
        # Pass the message on to the main application
        #

        def alertMainApp(self, bodyTuple):

          if self.qt:
            btz = '{0}'.format(bodyTuple)
            self.pubIn.emit(btz)
            LOGGER.info("Emitted Alert ")
          else:
            if self.interTaskQueue != None:
              self.interTaskQueue.put(bodyTuple)  # Pass it to the main thread
              LOGGER.info("Queued Alert.")
            else:
              LOGGER.error("No Inter-task data transfer method available to the subscriber task!")

Ошибка, которую я получаю при таком подходе: «AttributeError: тип объекта« Gui »не имеет атрибута« SubScriberThreadParent »»

Как я могу сделать эту работу?

Я также хотел бы знать объем условного импорта.

1 Ответ

0 голосов
/ 01 мая 2018

Чтобы один класс унаследовал от Gui.SubScriberThreadParent, вам необходимо создать экземпляр Gui и присвоить что-то переменной класса.

Рассмотрим этот код:

class Gui:
    def __init__(self, qt):
        if qt:
            class Foo:
                att = 'Foo'
            Gui.Parent = Foo
        else:
            class Bar:
                att = 'Bar'
            Gui.Parent = Bar

def makeThread():
    class Thread(Gui.Parent):
        def __init__(self):
            self.att = Gui.Parent.att
    return Thread()

def main():
    Gui(False)
    t = makeThread()
    print(t.att)

main()

Выход:

При Gui(False), как указано выше, вывод:

Bar

При изменении на Gui(True) вывод будет:

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