实现子表(查看表):设计类关系

时间:2010-11-18 20:05:53

标签: python oop design-patterns data-structures python-3.x

我正在使用Python 3,但这个问题与特定语言没有关联。

我有class Table实现了一个带主键的表。该类的实例包含实际数据(非常大)。

我想允许用户通过为Table的行提供过滤器来创建子表。我不想复制表,所以我打算在子表中保留父表中主键的子集。

显然,子表只是父表的一个视图;如果父表发生更改,它将更改,如果父表被销毁,它将变为无效,如果从父表中删除它们,它将丢失一些行。 [编辑:澄清一下,如果更改了父表,我不关心子表会发生什么;任何行为都没问题。]

我该如何连接这两个类?我在考虑:

class Subtable(Table):
  def __init__(self, table, filter_function):
    # ...

我的假设是Subtable保留Table的接口,除了略微覆盖继承的方法以检查行是否在。这是一个很好的实现吗?

问题是,我不知道如何初始化Subtable实例,因为我不想复制传递给它的表对象。它甚至可能吗?

另外我想给class Table一个返回Subtable实例的实例方法;但这会在Table上创建Subtable的依赖关系,我想最好避免使用?

1 个答案:

答案 0 :(得分:1)

我将使用以下内容(我省略了许多方法,例如sort,在这种安排中工作得很好;也省略了错误处理):

class Table:
    def __init__(self, *columns, pkey = None):
        self.pkey = pkey
        self.__columns = columns
        self.__data = {}

    def __contains__(self, key):
        return key in self.__data

    def __iter__(self):
        for key in self.__order:
            yield key

    def __len__(self):
        return len(self.__data)

    def items(self):
        for key in self.__order:
            yield key, self.__data[key]

    def insert(self, *unnamed, **named):
        if len(unnamed) > 0:
            row_dict = {}
            for column_id, column in enumerate(self.__columns):
                row_dict[column] = unnamed[column_id]
        else:
            row_dict = named
        key = row_dict[self.pkey]
        self.__data[key] = row_dict

class Subtable(Table):
    def __init__(self, table, row_filter):
        self.__order = []
        self.__data = {}
        for key, row in table.items():
            if row_filter(row):
                self.__data[key] = row

基本上,我只复制主键,并创建对与之关联的数据的引用。如果父表中的行被销毁,它仍将存在于子表中。如果在父表中修改了行,则也会在子表中修改该行。这很好,因为我的要求是“修改父表时会发生任何事情。”

如果您发现此设计存在任何问题,请告诉我们。