나는 그와 아무 관계가 없어도 메타 클래스 지옥을 발견했습니다.트리플 상속으로 인해 메타 클래스 충돌이 발생합니다 ... 간혹
저는 PySide를 사용하여 Qt4에 앱을 작성하고 있습니다. 이벤트 중심 부분을 Qt Designer 파일에서 생성 된 UI 정의와 분리하려고합니다. 따라서 "컨트롤러"클래스를 만들지 만, 내 인생을 편하게하기 위해 어쨌든 여러 개의 상속 클래스를 상속합니다. 예 :
이것은 예상대로 작동합니다. 또한 (QDialog
, Ui_Dialog
, BaseController
)의 상속을가집니다.
TypeError: Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
명확한 설명 : QObject
에서 모두 QMainWindow
및 QDialog
상속 내가 BaseController
를 서브 클래스에서 상속하려고 할 때 (BaseController
대신에) 서브 클래스가, 나 오류가 발생했다. BaseController
도 Qt 이벤트 시스템 특성 때문에 그것으로부터 상속되어야합니다. Ui_ 클래스는 단순한 Python 객체 클래스에서만 상속받습니다. 나는 해결책을 찾았지만, 그들 모두는 의도적으로 메타 클래스를 사용하는 경우를 포함한다. 그래서 나는 끔찍한 잘못을 저 지르게 될 것임에 틀림 없다.
편집 : 내 설명은 그래프를 추가하면 더 명확해질 수 있습니다.
근무 예 :
QObject
| \___________________
| object |
QMainWindow | BaseController
| /---Ui_MainWindow |
| | MainController
MainWindow-----------------/
또 다른 작업 예 :
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | |
OtherWindow----------------/
작동하지 예 :
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | OtherController
OtherWindow----------------/
저는 파이썬 메타 클래스에별로 좋지 않습니다.하지만 문제는 'MainWindow' 클래스 정의 내에서 부모 클래스를 정렬하는 것과 관련이 있다고 생각합니다. 그냥 추측. – Tony
나에게 가장 혼란스러운 점은 QDialog, Ui_Dialog 및 컨트롤러를 QObject에서 상속 한 클래스, QObject에서 상속 한 클래스에서 상속 한 클래스, QObject에서 상속 한 클래스와 같은 시퀀스에 넣으면서 MainWindow가 작동한다는 것입니다. – Red
파이썬에 대해서는 잘 모르지만 C++/Qt에서는 QObject의 다중 상속이 엄격히 금지되어 있습니다. 나는 당신이 동일한 문제를 겪고 있는지 궁금해하고, 당신의 경우 중 일부에서 일하는 것 같습니다. –