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()
行为的更多参考资料,请参见以下链接:
下一篇: Wrong checksum calculated after migrating code to C extension for python 3