7

[] (__getitem__)初期メモリ参照を使用してPython演算子とチェーンメソッドをオーバーロードすることは可能ですか?

Math次のような整数のリストを受け入れるクラスがあるとします。

class Math(object):
    def __init__(self, *args, **kwargs):
        assert(all([isinstance(item, int) for item in list(args)]))
        self.list = list(args)

    def add_one(self):
        for index in range(len(self.list)):
            self.list[index] += 1

そして、私はこのようなことをしたいです:

instance = Math(1,2,3,4,5)
instance[2:4].add_one()

このコードinstance.listを実行した後[1,2,4,5,5]、これは可能ですか?

私はのようなことができることを知っていますadd_one(2,4)が、これは可能であれば私が望んでいるAPIのスタイルではありません。

ありがとう

4

2 に答える 2

9

Winstonが言及しているように、補助オブジェクトを実装する必要があります。

class Math(object):
    def __init__(self, *args, **kwargs):
        self.list = list(args)

    def __getitem__(self, i):
        return MathSlice(self, i)

class MathSlice(object):
    def __init__(self, math, slice):
        self.math = math
        self.slice = slice

    def add_one(self):
        for i in xrange(*self.slice.indices(len(self.math.list))):
            self.math.list[i] += 1


instance = Math(1,2,3,4,5)
instance[2:4].add_one()

print instance.list

数学オブジェクトをMathSliceオブジェクトと共有する方法は、数学オブジェクトが変更された場合のセマンティクスをどのようにするかによって異なります。

于 2012-06-09T16:12:44.823 に答える
5

Numpyはこのようなことをします。

__getitem__メソッドはオブジェクトを受け取りますslice。詳細については、 http://docs.python.org/reference/datamodel.htmlを参照してください。新しいオブジェクトを返す必要がありますが、元のリストを変更するようにそのオブジェクトを実装します。

于 2012-06-09T16:07:32.707 に答える