特殊メソッド_6(Python_29)

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、オブジェクトの値の大小を比較する際の特殊メソッドについて見ていきました。

今回は数値演算の特殊メソッドについて見ていこうと思います。

数値演算の特殊メソッド

数値演算の特殊メソッドは、オブジェクトの値比較やデータ型の変換の特殊メソッドと違って、objectクラスで定義されていません。したがって数値演算可能なオブジェクトを作りたい場合は、クラスに特殊メソッドの定義が必要になります。数値演算の特殊メソッドは、以下のように記述します。

    def 特殊メソッド(self, other) または def 特殊メソッド(self)
        #処理
        return 値 

returnで返す値は、とくに型の指定はありません。

四則演算の特殊メソッド

それでは四則演算に対応する特殊メソッドについて見ていきましょう。以下の4つになります。

特殊メソッド 対応する演算子 機能
__add__(self, other) +演算子 selfとotherの値を加算した結果を設定
__sub__(self, other) -演算子 selfとotherの値を減算した結果を設定
__mul__(self, other) *演算子 selfとotherの値を乗算にした結果を設定
__truediv__(self, other) /演算子 selfとotherの値を除算にした結果を設定

動きを確認してみましょう。

class Class_A:
    def __init__(self , data):
        self.val = data

class Class_B:
    def __init__(self , data , name):
        self.val = data
        self.name = name

    def __add__(self, other):
        print(f'{self.name} の__add__が実行されました' , end=' - ')
        return self.val + other.val

a = Class_A(1)
b = Class_B(2 , "b")
c = Class_B(3 , "c")

動きを確認してみましょう。

print(b + a) # b の__add__が実行されました - 5
print(b + c) # b の__add__が実行されました - 3
print(a + b) # エラーとなる

いずれも右側のオブジェクトから特殊メソッドを呼び出しています。右側に特殊メソッドが設定されていないと、エラーになります。ここでは加算の例をあげましたが、ほかの3つでも同様です。

累算代入演算の特殊メソッド

累算代入演算についての特殊メソッドについて見ていきましょう。今回は以下の4つをご紹介します。上で紹介した四則演算の累算代入演算版です。

特殊メソッド 対応する演算子 説明
__iadd__(self, other) += selfとotherを加算した結果をselfに代入する
__isub__(self, other) -= selfとotherを減算した結果をselfに代入する
__imul__(self, other) *= selfとotherを乗算した結果をselfに代入する
__itruediv__(self, other) /= selfをotherで除算した結果をselfに代入する
class Class_C:
    def __init__(self , data):
        self.val = data

class Class_D:
    def __init__(self , data , name):
        self.val = data
        self.name = name

    def __iadd__(self, other):
        print(f'{self.name} の__iadd__が実行されました')
        self.val += other.val
        return self
    
a = Class_C(1)
b = Class_D(2 , "b")

累算代入演算の場合は、returnで返される値が右側の変数に設定されます。動きを確認してみましょう。

a = Class_C(1)
b = Class_D(2 , "b")
b += a # b の__iadd__が実行されました を返す
print(b.val) # 3 を返す
a += b # エラーとなる

やはり左側のオブジェクトから特殊メソッドが呼び出されています。

次回は継承

いかがでしょうか。ここまで色々な特殊メソッドを見てきました。種類によって挙動がすしずつ違うので注意が必要ですね。次回はクラスの重要な機能の1つ、継承について学んでいきたいと思います。お楽しみに!!

Python再学習のまとめはこちら!!