2013-12-09 4 views
5

pyside-uic 생성 파이썬 클래스를 상속하는 대화 상자 클래스가 있지만 내 문제는 다른 기본 클래스를 추가 할 수 없다는 것입니다.PySide, PysideUIC 및 다중 상속

import sys 
from PySide import QtGui 
from mi_ui import Ui_Dialog 

class Worker(object): 
    def __init__(self): 
     super(Worker, self).__init__() 
     self.data = 1 

class MainDialog(QtGui.QDialog, Ui_Dialog, Worker): 
    def __init__(self): 
     super(MainDialog, self).__init__() 
     self.setupUi(self) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    dlg = MainDialog() 
    print dlg.data 
    dlg.show() 

    sys.exit(app.exec_()) 

내가 WorkerMainDialog을 확장 할 때, 슈퍼 호출하지 않는 Worker__init__하기 때문에 인쇄 dlg.data 실패 "AttributeError가 '

MainDialog 데이터'객체가 더 속성이 '를"

내 유일한 해결 방법은 super를 무시하고 각각 __init__을 수동으로 호출하는 것 같습니다.

QtGui.QDialog.__init__(self) 
Worker.__init__(self) 

내 유일한 해결책입니까?

이것은 Python 2.7 용입니다.

+0

필자의 경험에 비추어 볼 때,'super()'는 PySide 래퍼와 Qt에서 작동하지 않는다. PyQt가 다른 점은 없다고 생각한다. 따라서'__init__'을 수동으로 호출하는 것이 유일한 방법 일 수 있습니다. 다이아몬드 모양의 상속을 피하거나 피하는 것이 좋습니다. – quazgar

답변

1

다중 상속은 파이썬에서 까다로울 수 있습니다. 당신이 완벽하게 작동하기를 원한다면 당신이 상속받은 클래스는 충돌을 일으킬 수 없습니다. 대부분의 경우 pyside를 사용한 다중 상속은 모든 것이 QObject를 상속하므로 동일한 변수와 메서드를 제공하므로 충돌이 발생합니다. 파이썬은 어느 것을 상속해야할지 모릅니다. 회화는 갈등의 또 다른 영역이다. 고려해야 할 또 다른 사항은 상속의 순서입니다. 나는 파이썬이 왼쪽에서 오른쪽으로 상속과 초기화를 시도한다고 믿는다. 따라서 QtGui.QDialog 및 Worker (Ui_Dialog가 충돌 할 수 있음)에 대한 init 메서드 만 필요하면 시도해 볼 수 있습니다.

class MainDialog(QtGui.QDialog, Worker, Ui_Dialog): 

파이썬 3에서는 수퍼 메소드를 조금 다르게 호출 할 수 있습니다.

class MainDialog(QtGui.QDialog, Worker, Ui_Dialog): 
    super().__init__() 

저는 2.7을위한 init을 호출하는 방법이 올바른 일을한다고 생각합니다. 이것과 비슷한 질문이 여기 저기에 있습니다. Diamond problem으로 알려진 일반적인 문제입니다. Python super method and calling alternatives 좀 더 설명 할 수 있습니다.

+0

그러나'super()'는 조상이 생성자를 적절하게 구현하면 (예 :'** keywords'를 수락하고 다음의'super()'로 전달할 때만) 알려진대로 작동합니다.Qt 클래스의 PySide 래퍼의 경우는 그렇지 않습니다. – quazgar

1

Worker 1 루 수준의 확인 : 먼저 호출되고

class MainDialog(Worker, QtGui.QDialog, Ui_Dialog) 

이 여전히 MainDialog.__init__가 발생합니다, 다음 Worker.__init__ (일부 인쇄 문을 추가하면 볼 수있는). 하지만 MainDialog.__init__ 내부에서 data 속성에 계속 액세스 할 수 있습니다.

object을 상속하는 일반적인 파이썬 클래스이며 super을 호출하지 않기 때문에 Ui_Dialog 클래스는 실제로이 중 하나에 포함되지 않습니다. 따라서 기본 클래스 주문에서 원하는 위치로 이동할 수 있습니다.

분명히, 당신이 이런 식으로 일을한다면, Worker 클래스에있는 다른 기본 클래스의 메소드를 혼란에 빠뜨리지 않도록주의해야 할 것입니다. 그러나 당신은 이미이 "문제"를 가지고 있습니다 (단지 다른 순서로).