2019.09.30
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つ目のリストのそれぞれの要素が、
足しあわされて出力されている。
期待通りの結果となっている。