【发布时间】:2021-09-01 01:33:06
【问题描述】:
我有一个类 DataSet 继承自 python 的 list 类:
class DataSet(list):
def __init__(self, *args):
super(DataSet, self).__init__(*args)
现在我可以创建这个类的一个实例并打印类型。
data = DataSet([0, 1, 2, 3, 4])
print(type(data))
>>> <class 'DataSet'>
但是,当我想以 DataSet 的一个子集为例并打印类型时,我得到:
data2 = data[2:4]
print(type(data2))
>>> <class 'list'>
发生这种情况是因为我没有覆盖list 的__getitem__ 方法。我知道python的list类有很多方法可以被覆盖以便使用它们,但我是一名程序员,我唯一想做的就是所有这些通常返回list类型实例的方法现在返回DataSet 类型的实例。有没有一种方法可以在不覆盖所有这些功能的情况下实现这一点?还是我必须手动覆盖所有这些方法?
【问题讨论】:
-
是的,您必须手动完成,但为什么要从
list继承呢? -
您打算向您的数据集添加任何有意义的内容吗?目前,我认为以这种方式包装列表没有任何好处。继承列表 (IsA) 可能不是要走的路,也许将列表作为内部成员 (HasA) 会更好地模拟您的关注点。或者您可以使用适用于列表的工具方法。
-
是的,我正计划对
DataSet做有意义的事情。更具体地说,我想用它来包含我自己的类DataPoint的实例,它由一个时间戳和一个值组成。DataSet包含使用此DataPoint类轻松进行计算的方法,例如欧拉微分。我认为继承列表类会起作用,因为它具有所有内置方法,但现在我最终必须覆盖它们,所以在这种情况下,HasA 可能会更好。 -
你为什么不从
collections.UserList继承呢?它几乎是为了避免直接从list继承而设计的,它有各种令人惊讶的副作用。我认为这也应该可以解决您的type问题。 -
您通常应该更喜欢组合而不是继承。
标签: python list inheritance overriding