代码之家  ›  专栏  ›  技术社区  ›  max

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

  •  1
  • max  · 技术社区  · 14 年前

    我使用的是Python3,但问题并不是与特定的语言相关。

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

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

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

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

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

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

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

    我也在想 返回 子表 实例;但这会创建 桌子 子表 ,我想最好避免?

    1 回复  |  直到 14 年前
        1
  •  1
  •   max    14 年前

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

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

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