この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、オブジェクトの値比較時の処理について学びました。整数型のオブジェクトと比較した際に返す値を設定しました。

今回は、前回のオブジェクトの値比較についてもう少し深堀してみようと思います。
特殊メソッドを設定しない場合
クラス作成時に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 を返す
左辺のオブジェクトに設定されている特殊メソッドが呼び出されました。
次回も特殊メソッド
いかがでしょうか。オブジェクトの値比較の特殊メソッドを設定する場合は、条件によってどのメソッドが呼び出されるのか注意が必要ですね。次回も引き続き特殊メソッドを見ていきます。今回やり残したオブジェクトの値比較とついて見ていきます。お楽しみに!!