11.4.3コンテナ型で利用できる特殊メソッド
コンテナー型に関わる特殊メソッド
メソッド 実行タイミング
__getitem__(self, key) obj[key]で参照したとき
__setitem__(self, key, value) obj[key]=valueで設定したとき
__delitem__(self, key) del obj[key]で削除したとき
__contains__(self, item) item in objで存在判定されたとき
__reversed__(self) reversed関数で呼び出されたとき

>>> class Person:
...    __slots__ = ['firstname', 'lastname', 'age']
...    def __init__(self, firstname, lastname):
...       self.firstname = firstname
...       self.lastname = lastname
...    def show(self):
...       print(f'私の名前は{self.lastname}{self.firstname}です!')
...
>>> class PersonList:
...    #Personクラスのリストを格納するための変数を準備
...    def __init__(self):
...       self.data = []
...    def add(self, person):
...       self.data.append(person)
...    def __getitem__(self, key):
...       return self.data[key]
...    def __setitem__(self, key, value):
...       self.data[key] = value
...
>>> if __name__ == '__main__':
...    pl = PersonList()
...    pl.add(Person('太郎', '山田'))
...    pl.add(Person('奈美', '掛谷'))
...    pl.add(Person('悟助', '田中'))
...    pl[1] = Person('哲也', '佐藤')
...    print(pl[1].firstname)
...
哲也
>>>
  1. 1.Personクラス:

    • __slots__ を用いて、Personオブジェクトが持つことのできる属性を firstname, lastname, age の3つに制限しています。これにより、これら以外の属性を誤って追加することを防ぐことができます。

    • __init__ メソッドを用いて、Personオブジェクトを作成する際に必要な情報(姓と名)を初期化しています。

    • show メソッドを用いて、Personオブジェクトの姓名を表示する機能を提供しています。


  2. 2.PersonListクラス
    :

    • __init__ メソッドを用いて、Personオブジェクトを格納するリスト data を初期化しています。

    • add メソッドを用いて、Personオブジェクトをリストに追加する機能を提供しています。

    • __getitem__ メソッドを用いて、リストから指定されたインデックスのPersonオブジェクトを取得する機能を提供しています。

    • __setitem__ メソッドを用いて、リストの指定されたインデックスのPersonオブジェクトを新しいPersonオブジェクトで置き換える機能を提供しています。


  3. 3.メインの実行部分
    :

    • PersonListオブジェクトを作成し、Personオブジェクトを追加しています。

    • 次に、リストの指定された位置(ここでは1番目)のPersonオブジェクトを新しいPersonオブジェクトで置き換えています。

    • 最後に、リストの指定された位置(ここでは1番目)のPersonオブジェクトの firstname 属性を出力しています。

以上があなたのコードの動作の詳細です。このコードを使えば、複数のPersonオブジェクトを一つのリストで管理することが可能になります。