1. ホーム
  2. python

[解決済み] getitem__ メソッドを理解する

2022-02-05 19:04:14

質問

のドキュメントにほとんど目を通しました。 __getitem__ をPythonのドキュメントで見ているのですが、まだその意味を把握できていません。

つまり、私が理解できるのは __getitem__ のような呼び出しを実装するために使用されます。 self[key] . しかし、どのような使い道があるのでしょうか?

例えば、このように定義されたPythonのクラスがあるとします。

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"])

これは期待通りの結果を返します。しかし、なぜ __getitem__ を使うことができるのでしょうか?また、Pythonは以下のように呼び出すと聞いたことがあります。 __getitem__ を内部で使用します。しかし、なぜそうなるのでしょうか?

どなたか、もう少し詳しく説明していただけませんか?

どのように解決するのですか?

コン・マがうまく説明してくれています。 __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 クラスの使い勝手を良くしました。

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] )

を使用するかどうか __setitem__ このように、データをどのように抽象化するかによりますが、今回はビルをフロアのコンテナとして扱うことにしました(ビルディングのイテレータを実装することもできますし、スライス(一度に複数のフロアのデータを取得)する機能もあるかもしれませんが、それは必要なものによります。