多重继承中的Python错误“TypeError:无法将X转换为Y”

时间:2013-07-12 18:47:50

标签: python qt pyqt multiple-inheritance typeerror

我在Python / PyQt中翻译了一个在C ++ / Qt中运行良好的代码,我不明白它为什么会产生错误。这是一个重现问题的最小代码:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class A(QFrame): 
    def __init__(self, parent) :
        QFrame.__init__(self, parent)    


class B(A, QLine):
    def __init__(self, parent) :
        A.__init__(self, parent)
        QLine.__init__(self, parent)

class C(B):

    def __init__(self, parent) :
        B.__init__(self, parent)
        self.setLine(0, 0, 0, 0)



if __name__ == "__main__":

    app     = QApplication(sys.argv)
    myApp   = QMainWindow()
    myApp.show()

    c = C(myApp)

    sys.exit(app.exec_())    

运行此代码时,我收到消息“TypeError:无法将'C'转换为'QLine'”...为什么会这样?问题是什么?如何到处走走?

1 个答案:

答案 0 :(得分:2)

根据various other posts,您无法从QObject继承两次。

他们都链接到http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html#multiple-inheritance,我再也找不到了。但是PyQt 4.10.2参考指南中的Things to be Aware Of说:

  

不可能从多个Qt类定义一个新的Python类。

引用其中一个答案:

  

限制不是来自python或PyQt。纯粹是因为Qt和   意味着您不能从多个继承或继承的类继承   QObject的。

根据其他答案,显然不是它在Qt中不可能,除非你使用虚拟继承(导致其他 Qt的问题),所以PyQt4会阻止它。特别是,在您的示例中,C并不是QFrame,只要您从不使用任何QFrame虚拟方法,或依赖于QFrame成员的任何函数1}}继承自QObject,你会碰巧逃脱它。


无论如何,这里似乎有一个明显的解决方法。你需要的是“C必须与A的类型相同(出于实际原因)”。你可以通过拆分A来获得它:

class AMixin(object):
    def __init__(self, parent):
        pass
    # A-specific behavior

class A(QFrame, AMixin):
    def __init__(self, parent) :
        QFrame.__init__(self, parent)
        A.__init__(self, parent)


class B(AMixin, QLine):
    def __init__(self, parent) :
        AMixin.__init__(self, parent)
        QLine.__init__(self, parent)

class C(B):
    def __init__(self, parent) :
        B.__init__(self, parent)
        self.setLine(0, 0, 0, 0)

现在CA有你(可能)想要的关系,但C只有一个QObject祖先,所以一切都很好。