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

2021-06-14 22:48:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个几乎相同的小部件,不同的是其中一个有一个额外的按钮。现在两种方法中有很多方法是完全相同的。我有什么策略在他们之间共享代码?子类化是最好的选择吗?有一天,我可能想用子类中不存在的功能来修改超类。你知道吗

2条回答
网友
1楼 ·

你必须使用子类。这是面向对象的一个非常基本的策略。 这个简介提供了一个很好的概述:http://www.jesshamrick.com/2011/05/18/an-introduction-to-classes-and-inheritance-in-python/ 但是你也可以找到很多其他的来源。你知道吗

网友
2楼 ·

只需使用常规继承。你知道吗

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

相关问题