2014-10-17 84 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

相关问题