实现子表(表的视图):设计类关系

1 投票
1 回答
1341 浏览
提问于 2025-04-16 07:17

我在用Python 3,但这个问题其实跟具体的编程语言没什么关系。

我有一个叫做Table的类,它实现了一个带主键的表格。这个类的实例包含了实际的数据(数据量很大)。

我想让用户通过提供一个过滤条件来创建一个子表格。我不想复制整个表格,所以我打算在子表格中只保留父表格的主键子集。

显然,子表格只是父表格的一个视图;如果父表格发生变化,子表格也会跟着变化;如果父表格被删除,子表格就会失效;如果父表格中的某些行被删除,子表格也会失去这些行。[编辑:为了澄清,如果父表格发生变化,我不在乎子表格会发生什么;任何行为都可以。]

我应该怎么把这两个类连接起来呢?我在想:

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

我假设Subtable保持Table的接口,只是稍微重写一下继承的方法,来检查行是否在里面。这算是一个好的实现吗?

问题是,我不确定在初始化Subtable实例时该怎么做,因为我不想复制传给它的表格对象。这可能吗?

我还在考虑给class Table一个实例方法,返回Subtable的实例;但这样会让Table依赖于Subtable,我想最好还是避免这样?

1 个回答

1

我将使用以下内容(我省略了很多方法,比如排序,这些在这个安排中效果很好;也省略了错误处理):

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

简单来说,我只是复制了主键,并创建了指向与这些主键相关数据的引用。如果父表中的一行被删除了,它在子表中仍然会存在。如果父表中的一行被修改了,子表中的对应行也会被修改。这是可以的,因为我的要求是“父表修改时随便”。

如果你觉得这个设计有什么问题,请告诉我。

撰写回答