我正在使用Python 3,但这个问题与特定语言没有关联。
我有class Table
实现了一个带主键的表。该类的实例包含实际数据(非常大)。
我想允许用户通过为Table的行提供过滤器来创建子表。我不想复制表,所以我打算在子表中保留父表中主键的子集。
显然,子表只是父表的一个视图;如果父表发生更改,它将更改,如果父表被销毁,它将变为无效,如果从父表中删除它们,它将丢失一些行。 [编辑:澄清一下,如果更改了父表,我不关心子表会发生什么;任何行为都没问题。]
我该如何连接这两个类?我在考虑:
class Subtable(Table):
def __init__(self, table, filter_function):
# ...
我的假设是Subtable
保留Table
的接口,除了略微覆盖继承的方法以检查行是否在。这是一个很好的实现吗?
问题是,我不知道如何初始化Subtable
实例,因为我不想复制传递给它的表对象。它甚至可能吗?
另外我想给class Table
一个返回Subtable
实例的实例方法;但这会在Table
上创建Subtable
的依赖关系,我想最好避免使用?
答案 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
基本上,我只复制主键,并创建对与之关联的数据的引用。如果父表中的行被销毁,它仍将存在于子表中。如果在父表中修改了行,则也会在子表中修改该行。这很好,因为我的要求是“修改父表时会发生任何事情。”
如果您发现此设计存在任何问题,请告诉我们。