collections.MutableSequence
抽象基本クラスからサブクラス化することを強くお勧めします。list
欠点は、 (user4815162342が指摘しているように)のサブクラスとして認識されないことです。ただし、結果のクラスを使用する人々が正しいことをしている限り、それはほとんど問題になりません(つまり、ダックタイピングを使用するか、具象クラスではなく抽象基本クラスをに渡します isinstance
)。
これの素晴らしい点は、次のメソッドを定義すると、残りのMutableSequence
インターフェイスを無料で入手できることです。MutableSequence
これは、さらにカスタマイズするためのテンプレートとして使用できる具体的なサブクラスです。あなたの場合、あなたは、、、、__init__
そしてをカスタマイズするだけでよいはずです。他のすべてはそれらの観点から定義されているため、挿入したチェックはすべて実行されます。__setitem__
insert
__delitem__
import collections
class MyList(collections.MutableSequence):
def __init__(self, it=()):
self._inner = list(it)
def __len__(self):
return len(self._inner)
def __iter__(self):
return iter(self._inner)
def __contains__(self, item):
return item in self._inner
def __getitem__(self, index):
return self._inner[index]
def __setitem__(self, index, value):
self._inner[index] = value
def __delitem__(self, index):
del self._inner[index]
def __repr__(self):
return 'MyList({})'.format(self._inner)
def insert(self, index, item):
return self._inner.insert(index, item)
いくつかの簡単なテスト:
>>> ml = MyList('foo')
>>> ml
MyList(['f', 'o', 'o'])
>>> ml.append(5)
>>> ml
MyList(['f', 'o', 'o', 5])
>>> ml.reverse()
>>> ml
MyList([5, 'o', 'o', 'f'])