gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:52:36 26 4
gpt4 key购买 nike

我有一个类DataSet继承自 python 的 list类(class):

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'>
发生这种情况是因为我没有覆盖 __getitem__ list的方法.我知道python的 list class 有很多方法可以被覆盖以使用它们,但我是一名程序员,我唯一想做的就是所有这些通常返回类型为 list 的实例的方法。现在返回 DataSet 类型的实例.有没有一种方法可以在不覆盖所有这些功能的情况下实现这一点?还是我必须手动覆盖所有这些方法?

最佳答案

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

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 - 我是否必须覆盖 python 的列表函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67999133/

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