我是不是必须覆盖 python 的列表函数?

Posted

技术标签:

【中文标题】我是不是必须覆盖 python 的列表函数?【英文标题】:Do I have to override python's list functions?我是否必须覆盖 python 的列表函数? 【发布时间】: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 问题。 您通常应该更喜欢组合而不是继承。 【参考方案1】:

你要求的不是不可能的。很容易迭代所有返回数组的函数,并使用装饰器将输出更改为你想要的。如果您研究该功能并手动处理它们,您将了解更多信息。

class DataSet(list):

    def __init__(self, *args):
        super(DataSet, self).__init__(*args)
#that where we must use decorator and loop over all builin functions
def  DataSet_evo(func):
    
    from inspect import signature
    
    def new_func(*args):
     res=func(*args)   
     if type(res)==type([])  :
      return DataSet(res)
     else:
      return res  #for example pop() it return element so it will throw eror as it not list 
         
   
    return new_func

for i in dir(DataSet):
 if i not in ["__init__","__class__"]:   
  try:   
   line="DataSet."+i+"="+"DataSet_evo(list."+i+")"   
   exec(line)
  except:
     pass# for handling .__class__ in dir
   
data = DataSet([0, 1, 2, 3, 4])
print(type(data))        
data2 = data[2:4]
print(type(data2))

愉快的编码

【讨论】:

以上是关于我是不是必须覆盖 python 的列表函数?的主要内容,如果未能解决你的问题,请参考以下文章

如果我在函数中使用指针来填充列表,我是不是必须在 C++ 中删除该函数末尾的指针?

c++部分面试题

C++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!

python-散列表

Python -> TypeError:列表索引必须是整数,而不是 str

python基础学习--函数