名前付きタプルクラスを実装する
このステップでは、位置インデックスと属性名の両方を使ってデータにアクセスできる NamedTuple
クラスを実装する方法を学びます。
- コードエディタで
namedtuple.py
ファイルを開きます。
NamedTuple
クラスを定義し、これは tuple
クラスから継承する必要があります。
__init__
メソッドでは、2つのパラメータを受け取ります。iterable
(データ)と fields
(データの名前)です。
iterable
と fields
をそれぞれインスタンス変数 self.data
と self.fields
として格納します。
for
ループを使って fields
を反復処理し、各フィールドを NamedTuple
インスタンスの属性として設定し、self.data
から対応する値を割り当てます。
__new__
メソッドを実装して、NamedTuple
クラスの新しいインスタンスを作成します。このメソッドは tuple
クラスの __new__
メソッドを呼び出し、新しいインスタンスを返す必要があります。
__getitem__
メソッドを実装して、位置インデックスと属性名の両方を使ってデータにアクセスできるようにします。インデックスが文字列の場合、self.fields
内の対応するフィールドのインデックスを見つけ、self.data
から値を返します。
__repr__
メソッドを実装して、NamedTuple
インスタンスの文字列を NamedTuple(x=1, y=2)
の形式で返します。ここで、x
と y
はフィールド名であり、1
と 2
は対応する値です。
完成した NamedTuple
クラスは次のようになります。
class NamedTuple(tuple):
def __init__(self, iterable, fields):
self.data = iterable
self.fields = tuple(fields)
for i, attr in enumerate(self.fields):
setattr(self, attr, self.data[i])
def __new__(cls, iterable, fields):
return super().__new__(cls, iterable)
def __getitem__(self, index):
if isinstance(index, str):
index = self.fields.index(index)
return self.data[index]
def __repr__(self):
return f"NamedTuple({', '.join(f'{field}={self[field]}' for field in self.fields)})"