Python 演算子オーバーロード


Python 演算子オーバーロード

概要

Pythonには演算子のオーバーロードがある。
既存のクラスの演算子の動作に不満がある時
当該クラスのラッパークラスを作り、
そのラッパークラス上で演算子をオーバーロードすれば、
ほぼ期待する結果が得られる。

実例

Pythonの+演算子はリストに使うと、
二つのリストを結合した新しいリストを返す。

combined_list = [1, 2, 3] + [4, 5, 6]
# [1, 2, 3, 4, 5, 6]を出力
print(combined_list)

これに不満で、個々の要素同士を足した
新しいリストを返してほしいことがある。
その際に、演算子のオーバーロードを使う。
以下では、ListをラップしたAltListというクラスを定義している。
AltListないで、+演算子をオーバーロードするために、
特殊メソッド__add__をオーバーロードしている。

class AltList:
    def __init__(self, *args):
        # 不特定多数の引数をリストにしてプロパティに代入
        self.content = list(args)

    def __add__(self, other_list : list):
        # 新しいAltListのコンストラクターに渡す引数リストを宣言
        new_list = self.content[:]

        for index, value in enumerate(other_list):
            if index < len(self.content):
                # 最初のリストに要素があれば、2番目のリストの要素と合算
                new_list[index] = self.content[index] + value
            else:
                # 最初のリストに要素がなければ、2番目のリストの要素をそのまま代入
                new_list.append(value)

        # AltListに新しいリストを代入
        return AltList(*new_list)

if __name__ == "__main__":
    native_list = [1, 2, 3, 4, 5] + [1, 2, 3, 4, 5, 6]
    print(native_list)

    alt_list = AltList(1, 2, 3, 4, 5) + [1, 2, 3, 4, 5, 6]
    print(alt_list.content)

実行結果

最初の表示では、二つのリストが結合されている。
二番目の表示では、1つ目のリストと2つ目のリストのそれぞれの要素が、
足しあわされて出力されている。
期待通りの結果となっている。

  • このエントリーをはてなブックマークに追加

PAGE TOP