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

2024-09-29 21:26:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3,但问题并不是与特定的语言有关。在

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

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

显然,子表只是父表的一个视图;如果父表发生变化,它将发生变化;如果父表被破坏,它将变得无效;如果从父表中删除这些行,它将丢失一些行。[编辑:为了澄清,如果父表被更改,我不关心子表会发生什么;任何行为都可以。]

我应该如何连接这两个类?我在想:

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

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

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

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


Tags: 数据实例方法用户视图语言过滤器table
1条回答
网友
1楼 · 发布于 2024-09-29 21:26:19

我将使用以下方法(我省略了许多方法,例如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

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

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

相关问题 更多 >

    热门问题