约束列表只采用整数

时间:2013-03-21 07:56:49

标签: python python-2.7

我正在尝试扩展列表类型以仅采用整数。我确实覆盖了附加 setitem ,但它无效。有什么指示吗?

class linked_list(list):

    def __init__(self):
        self.indx = 0

   def next(self):
        self.indx += 1
        return self.__getitem__(self.indx)

    def prev(self,indx):
        self.indx -= 1
        return self.__getitem__(self.indx)


    def __append__(self,val):
        if not isinstance(val,int):
            raise Exception('only integers accepted')
        super(linked_list,self).__append__(val)


    def __getitem__(self,indx):
        try:
            return super(linked_list,self).__getitem__(indx)
        except IndexError,e:
            StopIteration()

    def __setitem__(self,key,val):
        if not isinstance(val,int):
            raise Exception('only integers accepted')

        super(linked_list,self).__setitem__(key,val)

3 个答案:

答案 0 :(得分:4)

不是__append__,只是appendTypeError也可能是一个更合适的例外。

def append(self,val):
    if not isinstance(val, int):
        raise TypeError('only integers accepted')
    super(linked_list,self).append(val)

正如@TimPietzcker所说,您还应该适当地覆盖extend和其他方法

答案 1 :(得分:2)

您应该定义append方法,而不是__append__。您还应该覆盖__add____iadd__insertextend

答案 2 :(得分:2)

继承collections.MutableSequence代替list,您可以减少代码。 MutableSequence将根据以下五种方法自动实现所有其他列表方法。

from collections import MutableSequence

class IntList(MutableSequence):
    def __init__(self):
        super(IntList, self).__init__()
        self._list = []

    def __len__(self):
        return len(self._list)

    def __getitem__(self, index):
        return self._list[index]

    def __setitem__(self, index, value):
        if not isinstance(value, int):
            raise TypeError('only integers accepted')
        self._list[index] = value

    def __delitem__(self, index):
        del self._list[index]

    def insert(self, index, value):
        if not isinstance(value, int):
            raise TypeError('only integers accepted')
        self._list.insert(index, value)

另一方面,这不如手动覆盖所有list方法效率高 - 例如,extend提供的MutableSequence方法会调用__len__和每个元素__insert__一次。这可以通过覆盖任何对性能敏感的方法并更有效地进行修改来修改。

有关MutableSequence如何使用上述方法实施剩余的list方法的示例,请参阅this答案。