Python3 / PyQt中的多重继承顺序

时间:2018-04-11 03:24:17

标签: python-3.x pyqt5 multiple-inheritance

我在使用PyQt进行多重继承时遇到了一个问题, Programe 1#源代码如下:

#!python3
import sys;
from PyQt5.QtWidgets import *;
from PyQt5.QtGui import *;
from PyQt5.QtCore import *;

class WP_Widget(QWidget):
    def __init__(self):
        print("WP_Widget init");
        super().__init__();

class WP_Line(QLineEdit):
    def __init__(self, text='',*args, **kargs):
        super().__init__();
        self.setText(text);

class Widget_C(WP_Widget, WP_Line):
#class Widget_C(WP_Line, WP_Widget):
    def __init__(self):
        print('Widget_C self = ', self)
        super().__init__();

class App(QWidget):
    def __init__(self):
        super().__init__();
        fname = Widget_C();
        self.left = 100
        self.top = 100
        self.width = 100
        self.height = 100
        self.show();

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

执行时,它会将错误显示为:

AttributeError: 'Widget_C' object has no attribute 'setText'

如果更改Widget_C定义 从

class Widget_C(WP_Widget, WP_Line):

class Widget_C(WP_Line, WP_Widget):

它会成功运行。

我想它会与Python3中的 MRO 相关,所以我写了另一个程序2#来模拟状态:

#!python3

class QWidget():
    def __init__(self):
        print("Base QWidget init.");

class QLineEdit(QWidget):
    def __init__(self):
        print('LineEdit init');
        super().__init__();

    def setText(self, text):
        print('setText called');

class WP_Widget(QWidget):
    def __init__(self):
        print('WP_Widget Init');
        super().__init__()

class WP_Line(QLineEdit):
    def __init__(self, text='',*args, **kargs):
        print('WP_Line init');
        super().__init__();
        self.setText(text)

class Widget_C(WP_Widget, WP_Line):
#class Widget_C(WP_Line, WP_Widget):
    def __init__(self):
        super().__init__()

c_test = Widget_C()

但无论Wiget_C

的继承顺序如何
class Widget_C(WP_Line, WP_Widget):

class Widget_C(WP_Widget, WP_Line):

它们都会正常运行。

所以任何人都可以提供帮助:

  1. 解释为什么程序1#在定义为class Widget_C(WP_Widget, WP_Line):时失败, MRO 只是我的猜测。
  2. 为什么程序2#可以在这两种情况下正常运行?
  3. 帮助修改程序2#以重现程序1#的状态。
  4. Python and order of methods in multiple inheritance解释了一些关于 MRO 的内容,它与我的问题有关,但不完全是答案。 如果继承订单相同,我的程序1#程序2 不应该有不同的结果,因此关键点是程序1#的原因和程序2 有不同的现象。

1 个答案:

答案 0 :(得分:0)

ekhumoro给出了我需要的答案。

作为stated in the docs,pyqt不支持qt类的多重继承。也就是说,它不会像普通python中通常期望的那样工作。

话虽如此,this blog post有一些有趣的见解和解决方法(但请注意,它最初是为pyqt4编写的,因此有些事情现在可能已经过时了)。