我正在使用Python为我的项目创建GUI。虽然这是一个私人项目,但我想使用良好的编码实践。首先,让我介绍一下我的GUI模块的简化版本:
# Just a box, can have borders or it can be filled
class Box(object):
def __init__(self):
# Set initial state
def update(self, xy, press):
# I'm just a dummy box, I don't care about xy or press
pass
def draw(self):
# Draw
# Like a box but with special functionality
class Button(Box):
def __init__(self):
super(Button, self).__init__()
# Set initial state
def update(self, xy, press):
# Do something with xy and press
# Like a box but with special functionality
class Status(Box):
def __init__(self):
super(Status, self).__init__()
# Set initial state
def update(self, xy, press):
# Do something with xy, ignore press
# A box which can hold boxes inside it to group them
class Container(Box):
def __init__(self):
super(Container, self).__init__()
self.childs = deque()
def update(self, xy, press):
for c in self.childs:
c.update(xy, press)
# Container draws itself like a Box but also draws boxes inside it
def draw(self):
super(Container, self).draw()
for c in self.childs:
c.draw()
每个GUI组件都位于容器中。每个周期都会调用 Container update()来更新具有最新输入信息的组件的状态。
我喜欢这个解决方案,因为它允许我使用一个接口在一个循环中更新整个GUI,它节省了一些代码。我的问题是,其中一些孩子需要更多的信息来更新他们的状态,这会通过使用接口导致未使用的参数。
那么,在这种情况下使用未使用的参数是不好的做法,我应该放弃使用接口吗?
答案 0 :(得分:1)
执行此操作的常用方法称为协作继承,这实际上只是一个流行词,表示超级和子类都期望彼此存在并传递它可能不需要的信息。这种类型的方法看起来像:
def foo(self, specific, arguments, *args, **kwargs):
do_something_with(specific, arguments)
super(MyClass, self).foo(*args, **kwargs)
换句话说,每个更具体的Container
处理它的特殊之处,但是如果所有Container
的共同默认功能是什么(如果还没有 - 为什么我们使用继承?!)那么你只在超类中定义它并使用super
在子类中推迟它。