在两个几乎相同的小部件之间共享代码PySide
问题描述:
我有两个几乎完全相同的小部件,不同之处在于其中一个小部件有一个额外的按钮。现在有两种完全一样的方法。我有什么策略来分享它们之间的代码?在此划分最佳选择吗?有一天我可能想改变超类的功能,而这些功能不会存在于子类中。在两个几乎相同的小部件之间共享代码PySide
答
只需使用常规继承。
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的东西
答
你必须使用子类。这是OOP的一个非常基本的策略。 这个介绍给出了一个很好的概述:http://www.jesshamrick.com/2011/05/18/an-introduction-to-classes-and-inheritance-in-python/ 但是你也可以找到许多其他来源。
继承导致了一个奇怪的错误。所以这两个类都有一个ui文件与他们协助。该子类适当地调用它的ui文件。但是,这个类中有一个方法(retranslateUi),它存在于两个UI文件中。然而,子类会调用超级类别retranslateUi,这会在稍后混淆Ui。将unrelateUU重命名为别的东西可以解决这个问题,但是我不想每次更换我的Ui都这样做。任何想法如何解决这个问题? 编辑:没关系,我改变了继承的顺序,现在它的工作 – 2014-10-17 12:19:42
我编辑了我的答案,以显示其他事情,你可以做的继承敏感变量和属性,你可能不希望在子类。 – HashSplat 2014-10-17 13:45:27
是的,我基本上这样做。调用setupUi方法中的设置。为什么你使用_虽然?这有什么特别的理由吗? – 2014-10-17 13:53:50