我有两个几乎完全相同的小部件,区别在于其中一个小部件有一个额外的按钮。现在,两者中有很多方法完全相同。我有什么策略来共享它们之间的代码?在这里继承子类是最好的选择吗?有一天,我可能想要用子类中不存在的功能来改变超类。
答案 0 :(得分:1)
只需使用常规继承。
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
答案 1 :(得分:0)
你必须使用子类。这是OOP的一个非常基本的策略。 本简介概述:http://www.jesshamrick.com/2011/05/18/an-introduction-to-classes-and-inheritance-in-python/ 但是你也可能找到许多其他来源。