2017-04-26 17 views
6

私は__getitem__のドキュメントの大半をPythonのドキュメントとstackoverflowで使っていますので、これは重複する質問ではありません。しかし、私はまだそれの意味を理解することはできません。__getitem__メソッドの理解

私が理解できることは、self[key]のような呼び出しを実装するために__getitem__が使用されていることです。しかし、それの使用は何ですか?予想通り

class Person: 
    def __init__(self,name,age): 
     self.name = name 
     self.age = age 

    def __getitem__(self,key): 
     print ("Inside `__getitem__` method!") 
     return getattr(self,key) 

p = Person("Subhayan",32) 
print (p["age"]) 

これは結果を返します。

は、私は、このように定義されたPythonのクラスを考えてみましょう。しかし、最初に__getitem__を使用するのはなぜですか?私はまた、Pythonが__getitem__を内部的に呼び出していると聞いています。しかしそれはなぜそれをするのですか?

もっと詳しく説明できますか?

+0

[dictを適切にサブクラス化して__getitem__&__setitem__を適切にサブクラス化するにはどうすればよいでしょうか。 ](http://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict-and-override-getitem-setitem) – roganjosh

+0

あなたの例で '__getitem__'を使用しても意味がありませんが、あなたがtを必要としていると想像してくださいoカスタムのリストや辞書のようなクラスを書く。これは '[]'を使う既存のコードで動作する必要がある。これは '__getitem__'が便利な状況です。 –

答えて

7

コング馬は `のGetItem 'はために使用されているものを説明するのは良い仕事をしていません - 私はあなた与えたいです役に立つかもしれない例。 建物をモデル化するクラスを想像してみてください。建物のためのデータ内では、各フロアを占める企業の説明を含む属性の数を、含まれています

__getitem__を使用せずに、私たちは、このようなクラスを持っているでしょう:

class Building(object): 
    def __init__(self, floors): 
     self._floors = [None]*floors 
    def occupy(self, floor_number, data): 
      self._floors[floor_number] = data 
    def get_floor_data(self, floor_number): 
      return self._floors[floor_number] 

building1 = Building(4) # Construct a building with 4 floors 
building1.occupy(0, 'Reception') 
building1.occupy(1, 'ABC Corp') 
building1.occupy(2, 'DEF Inc') 
print(building1.get_floor_data(2)) 

私たちは、しかし、使用することができ__getitem__ (とそれに相当するのは__setitem__です)、Buildingクラスの使い方を「もっと良い」ものにします。このケースでは、我々は、床のコンテナ(として建物を治療することを決めた、あなたはまた、ビルのためのイテレータを実装することができ - あなたがこのよう__setitem__を使用するには本当にあなたが抽象化してデータをどのように計画するかに依存するかどうかを

class Building(object): 
    def __init__(self, floors): 
     self._floors = [None]*floors 
    def __setitem__(self, floor_number, data): 
      self._floors[floor_number] = data 
    def __getitem__(self, floor_number): 
      return self._floors[floor_number] 

building1 = Building(4) # Construct a building with 4 floors 
building1[0] = 'Reception' 
building1[1] = 'ABC Corp' 
building1[2] = 'DEF Inc' 
print(building1[2]) 

3

[]キーまたはインデックスで項目を取得する構文は、構文の砂糖です。

a[i]を評価すると、Pythonはa.__getitem__(i)(またはtype(a).__getitem__(a, i)ですが、この区別は継承モデルに関するものですが、ここでは重要ではありません)を呼び出します。 aのクラスが明示的にこのメソッドを定義していない場合でも、通常は先祖クラスから継承されます。

すべて(のPython 2.7)特別なメソッド名とその意味はここに記載されています:https://docs.python.org/2.7/reference/datamodel.html#special-method-names