gpt4 book ai didi

python - 对类属性进行假继承是否不好

转载 作者:太空宇宙 更新时间:2023-11-03 18:36:37 25 4
gpt4 key购买 nike

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

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

我发现易于实现的一种方法是重写 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")

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

最佳答案

由于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__()

关于python - 对类属性进行假继承是否不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21467634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com