Pythonでリストオブジェクトを継承して拡張するにはどうすればいいですか? 質問する

Pythonでリストオブジェクトを継承して拡張するにはどうすればいいですか? 質問する

私は 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'

おすすめ記事