私は Python リスト オブジェクトの使用に興味がありますが、機能を少し変更したいと思っています。特に、リストのインデックスを 0 からではなく 1 から付けたいと思っています。例:
>> mylist = MyList()
>> mylist.extend([1,2,3,4,5])
>> print mylist[1]
出力は次のようになります: 1
__getitem__()
しかし、これを実行するためにとメソッドを変更すると__setitem__()
、エラーが発生しましたRuntimeError: maximum recursion depth exceeded
。これらのメソッドをいろいろいじってみましたが、基本的には次のようになりました。
class MyList(list):
def __getitem__(self, key):
return self[key-1]
def __setitem__(self, key, item):
self[key-1] = item
問題は、self[key-1]
が定義している同じメソッドを呼び出していることだと思います。もしそうなら、メソッドlist()
の代わりに メソッドを使用するようにするにはどうすればいいでしょうか?の代わりにMyList()
を使用しようとしましたが、その結果、super[key-1]
self[key-1]
TypeError: 'type' object is unsubscriptable
何かアイデアはありますか? また、これに関する良いチュートリアルを教えていただければ嬉しいです!
ありがとう!
ベストアンサー1
関数を使用してsuper()
基本クラスのメソッドを呼び出すか、メソッドを直接呼び出します。
class MyList(list):
def __getitem__(self, key):
return list.__getitem__(self, key-1)
または
class MyList(list):
def __getitem__(self, key):
return super(MyList, self).__getitem__(key-1)
ただし、これによって他のリスト メソッドの動作が変わることはありません。たとえば、インデックスは変更されないため、予期しない結果が生じる可能性があります。
numbers = MyList()
numbers.append("one")
numbers.append("two")
print numbers.index('one')
>>> 1
print numbers[numbers.index('one')]
>>> 'two'