0

私はもともとこれをリストのラッパー クラスとして実装していましたが、提供する必要があるoperator () メソッドの数に悩まされていたので、単純にリストをサブクラス化することにしました。これは私のテストコードです:

    class CleverList(list):

        def __add__(self, other):
            copy = self[:]
            for i in range(len(self)):
                copy[i] += other[i]
            return copy

        def __sub__(self, other):
            copy = self[:]
            for i in range(len(self)):
                copy[i] -= other[i]
            return copy

        def __iadd__(self, other):
            for i in range(len(self)):
                self[i] += other[i]
            return self

        def __isub__(self, other):
            for i in range(len(self)):
                self[i] -= other[i]
             return self

    a = CleverList([0, 1])
    b = CleverList([3, 4])
    print('CleverList does vector arith: a, b, a+b, a-b = ', a, b, a+b, a-b)

    c = a[:]
    print('clone test: e = a[:]: a, e = ', a, c)

    c += a
    print('OOPS: augmented addition: c += a: a, c = ', a, c)

    c -= b         
    print('OOPS: augmented subtraction: c -= b: b, c, a = ', b, c, a)

通常の加算と減算は期待どおりに機能しますが、拡張加算と減算には問題があります。出力は次のとおりです。

    >>> 
    CleverList does vector arith: a, b, a+b, a-b =  [0, 1] [3, 4] [3, 5] [-3, -3]
    clone test: e = a[:]: a, e =  [0, 1] [0, 1]
    OOPS: augmented addition: c += a: a, c =  [0, 1] [0, 1, 0, 1]
    Traceback (most recent call last):
      File "/home/bob/Documents/Python/listTest.py", line 35, in <module>
        c -= b
    TypeError: unsupported operand type(s) for -=: 'list' and 'CleverList'
    >>> 

この例で拡張演算子を機能させるためのきちんとした簡単な方法はありますか?

4

1 に答える 1

5

__getslice__メソッドをオーバーライドしなかったため、次のようcになりますlist

>>> a = CleverList([0, 1])
>>> a
[0, 1]
>>> type(a)
<class '__main__.CleverList'>
>>> type(a[:])
<type 'list'>

これがすぐに使えるバージョンです:

def __getslice__(self, *args, **kw):
    return self.__class__(super(CleverList, self).__getslice__(*args, **kw))
于 2012-06-30T15:19:35.577 に答える