имеет некоторые интересные идеи и обходные пути (но обратите внимание, что изначально он был написан для pyqt4, поэтому некоторые вещи могут быть устаревшими).
лкнулся с проблемой при использовании множественного наследования с PyQt,Программа 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):
Это будет работать успешно.
Я думаю, это будет связано сMRO в Python3, поэтому я пишу другойпрограмма 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 # терпит неудачу, когда определяется какclass Widget_C(WP_Widget, WP_Line):
, MRO это только мое предположение.Почемупрограмма 2 # можно нормально запустить в обоих условиях?Помогите изменитьпрограмма 2 # воспроизвести состояниепрограмма 1 # .Python и порядок методов в множественном наследовании объясняет что-то оMROЭто связано с моим вопросом, но не совсем ответ. Если порядок наследования такой же, мойпрограмма 1 # а такжепрограмма 2 не должно иметь разных результатов, поэтому ключевой момент заключается в том, почемупрограмма 1 # а такжепрограмма 2 есть другое явление.