特殊メソッド_4(Python_27)

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

hirocom777.hatenadiary.org

前回は、オブジェクトの値比較時の処理について学びました。整数型のオブジェクトと比較した際に返す値を設定しました。

今回は、前回のオブジェクトの値比較についてもう少し深堀してみようと思います。

特殊メソッドを設定しない場合

クラス作成時にeqなどの特殊メソッドを設定しない場合、オブジェクトの基盤となるobjectクラスで定義してあるメソッドが適用されます。以下のスクリプトを実行してみましょう。

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

c1 = Class_A(0)
c2 = Class_A(0)

print(c1 == c2) # Falseを返す
print(c1 != c2) # Trueを返す
print(c1 <= c2) # エラーを返す

objectクラスには、eqなどのオブジェクトの値比較時に作用するメソッドがあらかじめ定義されています。

どちらの特殊メソッドが適用されるのか

オブジェクトの値比較の特殊メソッドが、双方のオブジェクトにある場合、どちらのメソッドが適用されるのでしょうか?確認してみましょう。

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

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

c3 = Class_B(0 , 'c3')
c4 = Class_B(0 , 'c4')

eqメソッドが呼び出された場合、どのオブジェクトから呼び出されているのか確認できるようにしました。動きを確認してみましょう。

print(c3 == c4) # c3 の__eq__が実行されました - True を返す
print(c4 == c3) # c4 の__eq__が実行されました - True を返す
print(c3 != c4) # c3 の__eq__が実行されました - False を返す

どうやら左辺のメソッドが優先されて動作するようです。

また、3番目の結果に注目してみます。Class_Bにはneメソッドが定義されていないので、objectクラスで定義してあるメソッドが適用される(エラーになる)と予想していました。でも、実際にはeqメソッドが呼び出されています。しかも、結果はちゃんと反転していますね。Class_Bに以下のコードを追加して、neメソッドを定義してみるとどうでしょう。

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

結果は以下のようになりました。

print(c3 == c4) # c3 の__eq__が実行されました - True を返す
print(c4 == c3) # c4 の__eq__が実行されました - True を返す
print(c3 != c4) # c3 の__ne__が実行されました - False を返す

今度はneメソッドが呼び出されました。どうやらeqメソッドが定義されていて、neメソッドが定義されていない場合、!=演算子による比較の結果はeqメソッドの反転結果が適用されるようなのです。

今までの結果は、すべて左側のオブジェクトの特殊メソッドが適用されていました。それでは左側のオブジェクトに該当する特殊メソッドがない場合はどうなるのでしょうか。最初に作成したClass_Aのオブジェクトと、Class_Bのオブジェクトの値を比較してみましょう。

c5 = Class_A(0)
c6 = Class_B(0 , 'c6')

print(c5 == c6) # c6 の__eq__が実行されました - True を返す
print(c5 != c6) # c6 の__ne__が実行されました - False を返す

左辺のオブジェクトに設定されている特殊メソッドが呼び出されました。

次回も特殊メソッド

いかがでしょうか。オブジェクトの値比較の特殊メソッドを設定する場合は、条件によってどのメソッドが呼び出されるのか注意が必要ですね。次回も引き続き特殊メソッドを見ていきます。今回やり残したオブジェクトの値比較とついて見ていきます。お楽しみに!!

hirocom777.hatenadiary.org

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