我想在Python中实现一个自定义列表类作为list
的子类。为了获得所有列表操作的完全类型兼容性,我需要从基类list
类重写的最小方法集是什么?
This question建议至少__getslice__
需要被覆盖。通过进一步研究,还需要__add__
和__mul__
。所以我有这个代码:
class CustomList(list):
def __getslice__(self,i,j):
return CustomList(list.__getslice__(self, i, j))
def __add__(self,other):
return CustomList(list.__add__(self,other))
def __mul__(self,other):
return CustomList(list.__mul__(self,other))
即使没有重写方法,以下语句也能按预期工作:
l = CustomList((1,2,3))
l.append(4)
l[0] = -1
l[0:2] = CustomList((10,11)) # type(l) is CustomList
这些语句仅适用于上述类定义中的重写方法:
l3 = l + CustomList((4,5,6)) # type(l3) is CustomList
l4 = 3*l # type(l4) is CustomList
l5 = l[0:2] # type(l5) is CustomList
我唯一不知道如何实现的是使扩展切片返回正确的类型:
l6 = l[0:2:2] # type(l6) is list
我需要将哪些内容添加到我的班级定义中才能将CustomList
作为l6
的类型?
此外,还有其他列表操作,而不是扩展切片,其结果将是list
类型而不是CustomList
?
答案 0 :(得分:21)
首先,我建议您关注Björn Pollex's advice(+1)。
要解决此特定问题(type(l2 + l3) == CustomList
),您需要实现自定义__add__()
:
def __add__(self, rhs):
return CustomList(list.__add__(self, rhs))
def __getitem__(self, item):
result = list.__getitem__(self, item)
try:
return CustomList(result)
except TypeError:
return result
我也建议......
pydoc list
...在您的命令提示符下。您将看到哪些方法list
公开,这将为您提供一个很好的指示,指出您需要覆盖哪些方法。
答案 1 :(得分:19)
您应该阅读文档中的这两部分:
编辑:为了处理扩展切片,您应该让__getitem__
- 方法处理切片对象(请参阅here,稍微向下)。
答案 2 :(得分:1)
可行的解决方案:子类UserList而不是list。 (为我工作。)这就是UserList的用途。