我正在尝试扩展列表类型以仅采用整数。我确实覆盖了附加, 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)
答案 0 :(得分:4)
不是__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
和其他方法
答案 1 :(得分:2)
您应该定义append
方法,而不是__append__
。您还应该覆盖__add__
,__iadd__
,insert
和extend
。
答案 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答案。