1. ホーム
  2. python

[解決済み] getitem__ のスライシングの実装

2022-06-28 05:37:06

質問

ベクター表現を作成するクラスで、スライス機能を実装しようとしています。

私は今のところこのコードを持っていて、これは適切にスライスを実装すると思いますが、私が以下のような呼び出しをするときはいつでも v[4] ここで、vはベクトルです pythonは十分なパラメータを持っていないというエラーを返します。そこで、どのようにして getitem という特別なメソッドを定義して、プレーンインデックスとスライシングの両方を処理する方法を見つけようとしています。

def __getitem__(self, start, stop, step):
    index = start
    if stop == None:
        end = start + 1
    else:
        end = stop
    if step == None:
        stride = 1
    else:
        stride = step
    return self.__data[index:end:stride]

どのように解決するのですか?

この __getitem__() メソッドは slice オブジェクトがスライスされたときに受け取ります。単に start , stop そして step のメンバーは slice オブジェクトのメンバを使用して、スライスのコンポーネントを取得します。

>>> class C(object):
...   def __getitem__(self, val):
...     print val
... 
>>> c = C()
>>> c[3]
3
>>> c[3:4]
slice(3, 4, None)
>>> c[3:4:-2]
slice(3, 4, -2)
>>> c[():1j:'a']
slice((), 1j, 'a')