实现子表(表的视图):设计类关系
我在用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
简单来说,我只是复制了主键,并创建了指向与这些主键相关数据的引用。如果父表中的一行被删除了,它在子表中仍然会存在。如果父表中的一行被修改了,子表中的对应行也会被修改。这是可以的,因为我的要求是“父表修改时随便”。
如果你觉得这个设计有什么问题,请告诉我。