1

我正在尝试扩展列表类型以仅采用整数。我确实覆盖了appendsetitem但它不起作用。请问有什么指点吗?

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)
4

3 回答 3

5

不是__append__,很简单append。也TypeError可能是一个更合适的例外。

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

正如@TimPietzcker 指出的那样,您还应该extend适当地覆盖和其他方法

于 2013-03-21T08:01:10.040 回答
3

通过继承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__

有关如何使用上述方法来实现其余方法的示例,请参见此答案。MutableSequencelist

于 2013-03-21T09:17:28.397 回答
2

您应该定义一个append方法,而不是__append__. 您还应该覆盖__add__,__iadd__和.insertextend

于 2013-03-21T08:05:58.360 回答