我如何在Python 3中有条件地创建和使用父类

时间:2018-05-01 14:25:01

标签: python multithreading pyqt

我正在构建一个我想在使用pyqt和其他guis的应用程序中使用的API。 如果一个程序员正在使用其他的gui,我不希望她必须导入pyqt等。 我的问题是我使用任务订阅消息并将它们传递给主任务。 我通过传递一个参数(qt)来实现这一点,该参数是True或False,具体取决于我们正在实现的gui。 然后我创建一个类,生成一个QtCore.QThread或Thread的SubscriberParent类。最终的SubscriberThread 是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:type object' Gui'没有属性' SubScriberThreadParent'"

我该如何做到这一点?

我也想了解条件导入的范围。

1 个答案:

答案 0 :(得分:1)

为了让一个类从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