2014-10-17 120 views
0

我有兩個幾乎完全相同的小部件,不同之處在於其中一個小部件有一個額外的按鈕。現在有兩種完全一樣的方法。我有什麼策略來分享它們之間的代碼?在此劃分最佳選擇嗎?有一天我可能想改變超類的功能,而這些功能不會存在於子類中。在兩個幾乎相同的小部件之間共享代碼PySide

回答

1

只需使用常規繼承。

class A(QtGui.QWidget): 
    def __init__(self): 
     super().__init__() 

     self.x = 1 

     self._initProperties() # Special method for changing values with inheritance 
    # end Constructor 

    def _initProperties(self): 
     """Initialize special inheritance properties.""" 
     self.setLayout(QtGui.QVBoxLayout()) 
    # end _initProperties 

    def do_something(self): 
     return self.x 

class B(A): 
    # def __init__(self): 
    #  super().__init__() 
    # 
    #  self.y = 2 
    # # Because we have _initProperties that will happen at the appropriate time we don't 
    # really need __init__. Just use _initProperties. 
    # However, I would still use __init__. I just commented it out as an example. 

    def _initProperties(self): 
     """Initialize special inheritance properties. 
     Note: We did not call super, so we are not using the parents _initProperties methods. 
       We are overriding the parent method. 
     """ 
     self.y = 2 
     self.setLayout(QtGui.QHBoxLayout()) 
    # end _initProperties 

    def do_something(self): 
     return super().do_something() + self.y 

備用選項是創建一個常規的對象類mixin。

class MyMixin(object): 
    def __init__(self): 
     super().__init__() 

     self.x = 1 

    def do_something(self): 
     return self.x 


class A(MyMixin, QtGui.QWidget): 
    pass 

class B(MyMixin, QtGui.QGroupBox): 
    def __init__(self) 
     super().__init__() 

     self.y = 2 

    def do_something(self): 
     return super().do_something() + self.y 

Python支持多重繼承。使用這種方法,類A可以是QWidget,而類B可以是類似QGroupBox的東西

+0

繼承導致了一個奇怪的錯誤。所以這兩個類都有一個ui文件與他們協助。該子類適當地調用它的ui文件。但是,這個類中有一個方法(retranslateUi),它存在於兩個UI文件中。然而,子類會調用超級類別retranslateUi,這會在稍後混淆Ui。將unrelateUU重命名爲別的東西可以解決這個問題,但是我不想每次更換我的Ui都這樣做。任何想法如何解決這個問題? 編輯:沒關係,我改變了繼承的順序,現在它的工作 – 2014-10-17 12:19:42

+0

我編輯了我的答案,以顯示其他事情,你可以做的繼承敏感變量和屬性,你可能不希望在子類。 – HashSplat 2014-10-17 13:45:27

+0

是的,我基本上這樣做。調用setupUi方法中的設置。爲什麼你使用_雖然?這有什麼特別的理由嗎? – 2014-10-17 13:53:50

相關問題