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以下の 5 つのメソッドに基づいて、他のすべてのリスト メソッドを自動的に実装します。

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によって提供されるメソッドは、要素ごとに1 回ずつMutableSequence呼び出します。これは、パフォーマンスに敏感なメソッドをオーバーライドし、より効率的に行うことで修正できます。__len____insert__

上記のメソッドを使用して残りのメソッドを実装する方法の例については、この回答を参照してください。MutableSequencelist

于 2013-03-21T09:17:28.397 に答える
2

appendではなく、メソッドを定義する必要があります__append____add__、、およびもオーバーライドする必要があり__iadd__ます。insertextend

于 2013-03-21T08:05:58.360 に答える