pyQt4和继承

由于很多原因,我正在考虑重做我在pyqt4中使用的程序(目前它在pygtk中)。 在玩弄它并感受它,并用gui构建了解它的理念之后,我遇到了一些恼人的错误或实现限制

其中之一是继承:

#!/usr/bin/env python 
#-*- coding: utf-8 -*- 
import sys
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication(sys.argv) 

class A(object): 
    def __init__(self): 
        print "A init" 

class B(A): 
    def __init__(self): 
       super(B,self).__init__() 
       print "B init" 

class C(QtGui.QMainWindow): 
    def __init__(self): 
        super(C,self).__init__()
        print "C init" 

class D(QtGui.QMainWindow,A): 
    def __init__(self): 
        print "D init" 
        super(D,self).__init__() 

print "nsingle class, no inheritance" 
A() 


print "nsingle class with inheritance" 
B() 

print "nsingle class with Qt inheritance" 
C() 


print "nsingle class with Qt inheritance + one other" 
D()

如果我运行这个,我会得到:

$ python test.py 

single class, no inheritance 
A init 

single class with inheritance 
A init 
B init 

single class with Qt inheritance
C init

single class with Qt inheritance + one other
D init

而我期待:

$ python test.py 

single class, no inheritance 
A init 

single class with inheritance 
A init 
B init 

single class with Qt inheritance 
C init 

single class with Qt inheritance + one other 
D init 
A init 

为什么当涉及到qt4类时,你不能使用super来初始化继承类? 我宁愿没有待办事项

QtGui.QMainWindow.__init__() 
A.__init__() 

任何人都知道发生了什么事?


这不是QT问题,但缺乏对多继承如何工作的理解。 你绝对可以使用多重继承,但这是Python中一个棘手的主题。

简而言之,在你的最后一个例子中,第一个__init__被调用,所以如果你将class D(QtGui.QMainWindow,A):改为class D(A, QtGui.QMainWindow):你会看到A的构造函数被调用,不是QMainWindow的。

有关多重继承的super()行为的更多参考资料,请参见以下链接:

  • Python的super()如何处理多重继承?
  • http://python-history.blogspot.com/2010/06/method-resolution-order.html
  • 链接地址: http://www.djcxy.com/p/65013.html

    上一篇: pyQt4 and inheritance

    下一篇: Wrong checksum calculated after migrating code to C extension for python 3