gpt4 book ai didi

python - 实现子表(查看表): designing class relationship

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:27 25 4
gpt4 key购买 nike

我使用的是 Python 3,但问题实际上与特定语言无关。

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

我想允许用户通过为表的行提供过滤器来创建子表。我不想复制该表,因此我计划仅在子表中保留父表中主键的子集。

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

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

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

我的假设是 Subtable 保留 Table 的接口(interface),除了稍微重写继承的方法只是为了检查行是否在其中。这是一个好的实现吗?

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

我还想给class Table一个返回Subtable实例的实例方法;但这会创建 TableSubtable 的依赖,我想最好避免吗?

最佳答案

我将使用以下方法(我省略了许多方法,例如排序,这些方法在这种安排中工作得很好;还省略了错误处理):

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

本质上,我仅复制主键,并创建对与其关联的数据的引用。如果父表中的一行被破坏,它仍然存在于子表中。如果父表中的一行被修改,子表中的行也会被修改。这很好,因为我的要求是“修改父表时一切都会发生”。

如果您发现此设计有任何问题,请告诉我。

关于python - 实现子表(查看表): designing class relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4219032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com