在两个几乎相同的小部件之间共享代码PySide

时间:2014-10-17 11:31:33

标签: python pyqt pyside

我有两个几乎完全相同的小部件,区别在于其中一个小部件有一个额外的按钮。现在,两者中有很多方法完全相同。我有什么策略来共享它们之间的代码?在这里继承子类是最好的选择吗?有一天,我可能想要用子类中不存在的功能来改变超类。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你必须使用子类。这是OOP的一个非常基本的策略。 本简介概述:http://www.jesshamrick.com/2011/05/18/an-introduction-to-classes-and-inheritance-in-python/ 但是你也可能找到许多其他来源。