使用接口时未使用的参数

时间:2017-11-03 21:54:40

标签: python user-interface

我正在使用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,它节省了一些代码。我的问题是,其中一些孩子需要更多的信息来更新他们的状态,这会通过使用接口导致未使用的参数。

那么,在这种情况下使用未使用的参数是不好的做法,我应该放弃使用接口吗?

1 个答案:

答案 0 :(得分:1)

执行此操作的常用方法称为协作继承,这实际上只是一个流行词,表示超级和子类都期望彼此存在并传递它可能不需要的信息。这种类型的方法看起来像:

def foo(self, specific, arguments, *args, **kwargs):
    do_something_with(specific, arguments)
    super(MyClass, self).foo(*args, **kwargs)

换句话说,每个更具体的Container处理它的特殊之处,但是如果所有Container的共同默认功能是什么(如果还没有 - 为什么我们使用继承?!)那么你只在超类中定义它并使用super在子类中推迟它。