我必须重写 python 的列表函数吗?

sui*_*aal 6 python inheritance overriding list

我有一个DataSet继承自 pythonlist类的类:

class DataSet(list):

    def __init__(self, *args):
        super(DataSet, self).__init__(*args)

Run Code Online (Sandbox Code Playgroud)

现在我可以创建此类的实例并打印类型。

data = DataSet([0, 1, 2, 3, 4])
print(type(data))
>>> <class 'DataSet'>
Run Code Online (Sandbox Code Playgroud)

但是,当我想采用其中的一个子集DataSet并打印类型时,我得到:

data2 = data[2:4]
print(type(data2))
>>> <class 'list'>
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为我没有重写__getitem__的方法list。我知道 python 的list类有很多可以重写的方法,以便使用它们,但我是一名程序员,我唯一想做的就是让所有这些通常返回类型实例的方法现在list返回该类型实例DataSet。有没有一种方法可以实现这一点,而不覆盖所有这些功能?或者我是否必须手动覆盖所有这些方法?

小智 -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))
Run Code Online (Sandbox Code Playgroud)

快乐编码