首先,这个问题是基于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")
我想知道这是否真的很糟糕,如果有更好的方法。
答案 0 :(得分:1)
由于DockWidget
和Test
都继承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__()