2012-06-09 10 views
7

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

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 

そして、私はこのような何かをしたい:

私はこのように、整数のリストを受け入れクラスMathを持っている想像し

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

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

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

ありがとうございました

答えて

9

ウィンストンは述べているように、あなたは、補助オブジェクトを実装する必要があります:あなたはMathSliceオブジェクトと数学のオブジェクトを共有する方法

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 

を使用すると、数学のオブジェクトの変更ならば意味がなりたいものに依存。

+0

'xrange(* self.slice.indices(len(self.math.list)))'はひどくうんざりしています。より良い方法がありますか? – Eric

+0

また、 'self.fields'と' self.list'を混在させています – Eric

+0

@Eric:不要なMath.add_oneを削除しました。そしてxrange(* ...)は非常に扱いにくいようですが、わかりませんより短い方法。 –

5

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

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

+0

ありがとうWinstonあなたの答えです。私はネッドの答えを受け入れています。なぜなら、彼は実装の詳細をもっと与えているから、他のユーザーはもっと役に立つと思うと思います。しかし、私はあなたの答えに感謝します。 – maraujop

関連する問題