如何在没有类型问题的情况下继承Python列表?

时间:2011-11-18 09:05:44

标签: python list subclass

我想在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

3 个答案:

答案 0 :(得分:21)

首先,我建议您关注Björn Pollex's advice(+1)。

要解决此特定问题(type(l2 + l3) == CustomList),您需要实现自定义__add__()

   def __add__(self, rhs):
        return CustomList(list.__add__(self, rhs))

对于extended slicing

    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的用途。