2016-07-21 4 views
2

すべてのリストは__setitem____getitem__であり、intは__add____sub__であり、その値で動作するようになっています。しかし、その価値は実際にどこに保存されているのですか/それをどのように参照できますか?クラスを模倣するようにしたいとします。これは、このリスト、int、文字列などのオブジェクトの値はどこに保存されていますか?

class Memory(object): 
    def __init__(self): 
     self.data = [] 
    def __getitem__(self, i): 
     return self.data[i] 
    def __setitem__(self, key, item): 
     self.data[key] = item 

これはあまり効率的ではない、と私は複数のクラスで数百行にまたがることができ、最も可能性の高い個別のクラスのすべての単一のメソッドを記述する必要があるだろうようになります。

class Memory(list): 
... 

しかし、あなたはその値を参照することはできませんので、あなたがそのメソッドのいずれかを編集することはできません。のようなリストの子であることクラスを作成するには

次の最善の解決策。変更した場合__setitem__() これで何をしたいのですか?リストクラスを作成して、1つのラムダでリストの設定やその他の操作の値をすべて行うことができます。 __setitem__(key,item)に直接電話するだけでは、既にリストにある項目の範囲外のキーを入力することはできないからです。 __setitem__()メソッドを呼び出さずにリストの値を編集するにはどうすればよいでしょうか。

+0

コンピュータで! http://s2.quickmeme.com/img/6a/6a3b31692b322eea09f6888adf1ff62f5d003c9a7d8c98e8922faaca070f4582.jpg –

答えて

1

私はこれが "値が保存されている場所"についてのあなたの質問に直接答えることはできないと分かりました。そして、あなたが意味するものはわかりません "私は単に直接__setitem__(key,item)に電話できません。リストに既に存在する項目の範囲外のキーを入力してください。 "しかし、私が正しく理解していれば、設定したい値と現在の長さの間の値を"入力 "しなければなりません。

たとえば、私はこれを行うために時々使用するユーティリティクラスを持っています。 (使用方法のアイデアについては、下のテストケースを参照してください)

class DynamicArray(list): 
    ''' Just like a normal list except you can skip indices when you fill it. ''' 

    def __init__(self, defaultVal = None, startingCapacity = 0): 
     super(DynamicArray, self).__init__() 
     self.defaultVal = defaultVal 
     if (startingCapacity > 0): 
      self += [ defaultVal ] * startingCapacity 


    def insert(self, ind, val): 
     if (ind > len(self)): 
      for i in xrange(len(self), ind): 
       self.append(self.defaultVal) 
     super(DynamicArray, self).insert(ind, val) 


    def set(self, ind, val): 
     self[ind] = val 


    def __setitem__(self, ind, val): 
     if (ind >= len(self)): 
      for i in xrange(len(self), ind + 1): 
       self.append(self.defaultVal) 
     super(DynamicArray, self).__setitem__(ind, val) 



if __name__ == "__main__": 
    a = DynamicArray() 
    assert(len(a) == 0) 
    a[3] = 2 
    assert(a[3] == 2) 
    assert(a[0] is None and a[1] is None and a[2] is None) 
    assert(len(a) == 4) 
    a[1] = 1 
    assert(a[1] == 1) 
    assert(a[3] == 2) 
    assert(a[0] is None and a[2] is None) 
    assert(len(a) == 4) 
    a[5] = 7 
    assert(a[5] == 7) 
    assert(a[3] == 2) 
    assert(a[1] == 1) 
    assert(a[0] is None and a[2] is None) 
    assert(len(a) == 6) 
+0

申し訳ありませんが、これは私が質問で探していたものではありません。 – tatatat0

+0

@ tatatat0申し訳ありません。私があなたの質問を理解しているなら、答えはあなたがリストのようなPythonオブジェクトの実際のストレージにアクセスできないということです。これらは通常C言語で実装されており、アクセスできたとしても概念的には「プライベート」なので、とにかく「カプセル化を解除する」のは良い考えではありません。私の答えは、直接アクセスに失敗した場合、代わりに 'list'を継承し、' __setitem__'(あなたの "次善策")のようなメソッドをオーバーライドすることを想定していました。私はあなたがそこにぶら下がっていた(私が思った)問題を回避する方法をあなたに示すことを試みていました。 – Turix

関連する問題