如何扩展类实例?

时间:2013-12-08 13:18:52

标签: python constructor

我有一个实例..

groupCell = QtGui.QGroupBox()
print groupCell.title() #this class has a method title()

我无法更改此实例的任何内容,它是如何实现的......

我需要扩展这个实例(添加一些方法等)。

class GroupBoxWithCheckbox (QtGui.QGroupBox):
    def __init__(self, basegroupbox, checkbox):
        #something like self = basegroupbox ?
        self.checkbox = checkbox
    def method(self):
        pass

最后

groupCellWithCheckBox = GroupBoxWithCheckbox(groupCell, checkbox)
print groupCellWithCheckBox.title()

我必须获得与groupCell相同的标题。

2 个答案:

答案 0 :(得分:1)

您可以定义一个扩展QtGui.QGroupBox的新类,如下所示:

class GroupBoxWithCheckbox(QtGui.QGroupBox):

    def __init__(self, checkbox):
        super(GroupBoxWithCheckbox, self).__init__()
        self.checkbox = checkbox

    def method(self):
        pass

然后,您只需将groupCell作为类的实例,并在初始化时传入一个复选框:

groupCell = GroupBoxWithCheckbox(checkbox)

这将与您在此处尝试的效果相同。


编辑,因为已提供新信息:

由于我们在这里谈论Python,您可以动态地将内容添加到您想要的任何实例中。完全可以这样做:

groupCell.checkbox = checkbox

即使groupCell没有复选框属性。设置时会添加该属性,如上面的代码段所示。你可以用它来做你想做的事。这有点奇怪,我不推荐它,但工作。另一种方法是创建某种包装类:

class GroupBoxWithCheckbox(object):
    def __init__(self, groupbox, checkbox):
        self.groupbox = groupbox
        self.checkbox = checkbox

groupCell = GroupBoxWithCheckbox(groupCell, checkbox)

然后,只要您想要访问原始GroupBox的方法,就可以执行类似

的操作
groupCell.groupbox.title()

groupCell.groupbox将包含原始GroupBox所有方法的所有,但您也可以访问groupCell.checkbox

后者的解决方案是我在编写此代码时要实现的。

答案 1 :(得分:0)

使用super调用基类构造函数:

class GroupBoxWithCheckbox(QtGui.QGroupBox):
    def __init__(self, basegroupbox, checkbox):
        super(GroupBoxWithCheckbox, self).__init__()
        self.checkbox = checkbox
        self.basegroupbox = basegroupbox
    def title(self):
        return self.basegroupbox.title()