2016-12-20 1 views
0

私はPythonで新しいです。
以下は、range()に似ているが、範囲境界を含む点を除いて、mathodのクラスです。クラス内でインデックス作成メソッドを定義する方法(__getitem__しようとしました)

特定のインデックスが呼び出されたときにそのインデックスを持つ要素が返されるように、クラス内にインデックスメソッドを作成しようとしています。私は__getitem__がインデックス作成を実行できることを読んでいますが、正しく実装することはできませんでした。より効率的な方法がある場合は、必ずしも__getitem__を使用しないでください。

以下のコードをご覧ください。これはクラスの作成方法を学習するための簡単なコードです。

def __getitem__(self,index)で始まるメソッドは機能しないメソッドで、これは最後にインデックスを呼び出すことに相当しますo[4]これは達成したいものです。

class inclusive_range: 
    def __init__(self, *args): 
     numargs = len(args) 
     if numargs < 1: raise TypeError('requires at least one argument') 
     elif numargs == 1: 
      self.stop = args[0] 
      self.start = 0 
      self.step = 1 
     elif numargs == 2: 
      (self.start,self.stop) = args 
      self.step = 1 
     elif numargs == 3: 
      (self.start,self.stop,self.step) = args 
     else: 
      raise TypeError('three arguments required at most, got {}'.format(numargs)) 

    def __iter__(self):  # this makes the function (the method) and iterable function 
     i = self.start 
     while i <= self.stop: 
      yield i 
      i += self.step 

    def __getitem__(self,index): 
     return self[index] 
     print(self[index]) 

def main(): 
    o = inclusive_range(5, 10, 1) 
    for i in o: print(i, end=' ') 
    o[2] 

if __name__ == "__main__": main() 

あなたは

+1

[なぜ1000000000000000の範囲(1000000000000001)がPython 3ですばらしいのですか?](// stackoverflow.com/a/30081318) –

+2

'return self [index]'?それはかなり隠れた再帰です... – Uriel

答えて

4

あなただけself.start、インデックスとステップサイズに基づいて数を計算することができますと思いますありがとうございました。あなたのオブジェクトが境界線をテストする際に便利ですあなたはまた、長さを必要とする適切な順序、であるために:

def __len__(self): 
    start, stop, step = self.start, self.stop, self.step 
    if step < 0: 
     lo, hi = stop, start 
    else: 
     lo, hi = start, stop 
    return ((hi - lo) // abs(step)) + 1 

def __getitem__(self, i): 
    length = len(self) 
    if i < 0: 
     i += length 
    if 0 <= i < length: 
     return self.start + i * self.step 
    raise IndexError('Index out of range: {}'.format(i)) 

上記包括的であること終わりを考慮するために、小さな調整で、my own translation of the range() source code to Pythonに基づいています。

私は__len__の結果を__init__にキャッシュして、長さを知るたびに再計算する必要がないようにします。

関連する問題