##
3.3.6 配列型エミュレーションで使われるその他のメソッド

以下のオプションとなるメソッドを定義して、配列オブジェクトをより高度に エミュレーションできます。変更不能な配列のメソッドでは、 `__getslice__()` が定義できるだけです; 変更可能な配列では 三つのメソッド全てを定義できます。

`__getslice__`( | self, i, j)

  リリース 2.0 以降で撤廃された仕様です。 スライスオブジェクトは `__getitem__()` メソッドの パラメタとしてサポートするようになりました。
  `self[i:j]` の値評価を実現するために呼び出され ます。返されるオブジェクトは self と同じ型でなければなりません。 スライス表記で i や j がない場合には、それぞれゼロや `sys.maxint` に置き換えられるので注意してください。 スライスに負のインデクスが用いられた場合、配列の長さがインデクス値に 加算されます。インスタンスが `__len__()` メソッドを実装して いない場合には、`AttributeError` が送出されます。 この計算の結果、インデクス値が負でなくなるという保証はありません。 配列の長さよりも大きなインデクス値は修正されません。 `__getslice__()` が定義されていない場合、代わりに スライスオブジェクトが生成されて `__getitem__()` に渡されます。

`__setslice__`( | self, i, j, sequence)

  `self[i:j]` への代入を実現するために呼び出され ます。i および j に関しては、`__getslice__()` と同じ注釈があてはまります。

  このメソッドは撤廃されています。 `__setslice__()` がないか、 `self[i:j:k]` 形式の拡張スライス の場合には、`__setslice__()` が呼ばれる代わりにスライス オブジェクトが生成され、`__setitem__()` に渡されます。

`__delslice__`( | self, i, j)

  `self[i:j]` の削除を実現するために 呼び出されます。i および j に関しては、`__getslice__()` と同じ注釈があてはまります。

  このメソッドは撤廃されています。 `__delslice__()` がないか、 `self[i:j:k]` 形式の拡張スライス の場合には、`__delslice__()` が呼ばれる代わりにスライス オブジェクトが生成され、`__delitem__()` に渡されます。

これらのメソッドは、単一のコロンを使った単一のスライスで、かつ スライスメソッドが利用できるときにだけ呼び出されることに注意 してください。拡張スライス表記を含んでいるスライス表記や、 スライスメソッドがない場合、`__getitem__()`、 `__setitem__()` 、あるいは `__delitem__()` が スライスオブジェクトを引数として呼び出されます。

以下の例は、プログラムやモジュールを以前のバージョンの Python に対して互換性を持たせる方法を示したものです (`__getitem__()`、 `__setitem__()` 、および `__delitem__()` は引数としてスライスオブジェクトを サポートするものと仮定します):

    class MyClass:
        ...
        def __getitem__(self, index):
            ...
        def __setitem__(self, index, value):
            ...
        def __delitem__(self, index):
            ...

        if sys.version_info < (2, 0):
            # They won't be defined if version is at least 2.0 final

            def __getslice__(self, i, j):
                return self[max(0, i):max(0, j):]
            def __setslice__(self, i, j, seq):
                self[max(0, i):max(0, j):] = seq
            def __delslice__(self, i, j):
                del self[max(0, i):max(0, j):]
        ...

`max()` を呼び出していることに注意してください; この呼び出し `__*slice__()` メソッド呼び出される前に、負のインデクス値を処理 しておくために必要です。 負のインデクス値が使われた場合、 `__*item__()` メソッドは与えら れた値をそのまま使いますが、`__*slice__()` メソッドは ``調理済みの (cooked)'' 形式になったインデクス値を受け取ります。 負のインデクス値が使われると、メソッドを呼び出す前に、常に配列の長さを インデクス値に加算します (加算してもまだ負の値となっていてもかまいませ ん); これは、組み込み配列型における慣習的な負のインデクス処理方法で、 `__*item__()` メソッドでも同様の処理を行うよう期待しています。 しかし、ここではすでに負のインデクス値の処理を行っているので、負のイン デクスを渡すべきではありません; インデクス値は、`__*item__()` メソッドに渡される前に、配列のインデクス集合の境界に制限されていなけれ ばなりません。`max(0, i)` を呼び出せば、適切な値を返すので便利です。