为类属性做假继承是不好的

时间:2014-01-30 21:21:18

标签: python inheritance python-3.x pyqt pyside

首先,这个问题是基于PySide的,但它是类属性继承的一般问题。

所以我有一个继承问题。我基本上想继承2个PySide GUI类。多重继承存在重大冲突并出现错误。基本上,我制作了一个自定义小部件,并希望将相同的小部件放入停靠小部件(浮动窗口)。

我发现易于实现的一种方法是覆盖 getattr 方法来重定向属性调用,如下所示。

class DockWidget(QtGui.QDockWidget):
    def __init__(self):
        super().__init__()
        self.test = Test()

        # Container is a custom widget containing the Test widget and a toolbar.
        self.setWidget(self.test.getCustomContainer())

    def __getattr__(self, name):
        """Call a property's method when the given attribute name is not found.

        Note: Gives full access to the test attribute.

        Args:
            name (str): Method or property name.
        """
        if hasattr(self.test, name):
            return self.test.__getattribute__(name)
    # end __getattr
# end class DockWidget

class Test(QtGui.QWidget):
    def doSomething(self, msg):
        print(msg)
    # end doSomething
# end Test

widg = DockWidget()
widg.doSomething("Test")

我想知道这是否真的很糟糕,如果有更好的方法。

1 个答案:

答案 0 :(得分:1)

由于DockWidgetTest都继承QWidget,因此您可以使用mixin。这将允许您执行重新实现虚拟方法的操作,这是使用__getattr__无法实现的。

class WidgetMixin(object):
    def doSomething(self, msg):
        print(msg)

    def closeEvent(self, event):
        print(self.__class__.__name__)

class Test(WidgetMixin, QtGui.QWidget):
    def __init__(self):
        super().__init__()

class DockWidget(WidgetMixin, QtGui.QDockWidget):
    def __init__(self):
        super().__init__()