特殊メソッド_3(Python_26)

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

hirocom777.hatenadiary.org

前回は、データ型変換処理の特殊メソッドについて学びました。

今回も特殊メソッドです。オブジェクトの値比較時の処理について見ていきましょう。

オブジェクトの値比較

Pythonのオブジェクトには、値の要素を持って比較できるものがあります。==演算子などの比較演算子を使用して比較します。整数型、浮動小数点型などの数値型の比較を行います。文字列型の比較も可能です。この場合Unicode文字コードを比較します。

新しく作成したクラスのオブジェクトを比較すると、どんな結果になるのでしょうか。以下のスクリプトを実行してみましょう。

class ClassTest_1:
    pass

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

異なる型のオブジェクトですので、等しくないという結果になりました。値の大小については比較できないのでエラーになってしまいました。オブジェクト生成時に指定した値と比較できるようにしてみましょう。

class ClassTest_2:
    def __init__(self , data):
        self.val = data
    
    def __eq__(self, other):
        if isinstance(other, int):
            # print('__eq__が実行されました')
            return self.val == other
        return False

    def __ne__(self, other):
        if isinstance(other, int):
            # print('__ne__が実行されました')
            return not self.__eq__(other)
        return False
    
    def __lt__(self, other):
        if isinstance(other, int):
            # print('__lt__が実行されました')
            return self.val < other
        return False

c1 = ClassTest_2(1)
print(c1 == 1) # Trueを返す
print(c1 != 1) # Falseを返す
print(c1 < 1) # Falseを返す
print(c1 < 2) # Trueを返す

比較する前にisinstance関数で、引数の型チェックをしています。

比較が正しく行われています。__eq__メソッドは、オブジェクトが==演算子で比較された際に返す値を指定できます。 __ne__メソッドは、オブジェクトが!=演算子で比較された際に返す値を指定できます。!=演算子で比較した結果は、==演算子で比較した結果の逆です。

上の例では、__ne__メソッド内で__eq__メソッドを呼び出してnot演算子で反転させています。 __lt__メソッドは、自身が比較対象より小さいかどうかを比較された場合に返す値を指定できます。

オブジェクトの値比較の特殊メソッドは、以下のように記述します。

    def オブジェクトの値比較特殊メソッド(self, other)
        #処理
        return 値 

selfは自分自身、otherは比較対象を意味します。returnで返す値は、とくに型の指定はありません。メソッドの性質上ブール型を返すことが多いと思います。

特殊メソッド 対応する演算子 機能
__eq__(self, other) ==演算子 selfとotherの値が等しいかを調べた結果を設定
__ne__(self, other) !=演算子 selfとotherの値が等しくないかを調べた結果を設定
__lt__(self, other) <演算子 selfがotherより小さいかどうかを調べた結果を設定
__le__(self, other) <=演算子 selfがother以下かどうかを調べた結果を設定
__gt__(self, other) >演算子 selfがotherよりも大きいかどうかを調べた結果を設定
__ge__(self, other) >=演算子 selfがother以上かどうかを調べた結果を設定

ちなみに、以下のように比較対象との位置を入れ替えても比較できます。

c1 = ClassTest_2(1)
print(1 == c1) # Trueを返す
print(1 != c1) # Falseを返す
print(1 > c1) # Falseを返す
print(2 > c1) # Trueを返す

次回もオブジェクトの値比較

いかがでしょうか。比較演算子で比較した結果を設定できるというのは、なかなか興味深いですね。今回はわかりやすい例を挙げるため、整数型のオブジェクトと比較しました。次回はもう少し深堀してみようと思います。お楽しみに!!

hirocom777.hatenadiary.org

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