この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、データ型変換処理の特殊メソッドについて学びました。
今回も特殊メソッドです。オブジェクトの値比較時の処理について見ていきましょう。
オブジェクトの値比較
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を返す
次回もオブジェクトの値比較
いかがでしょうか。比較演算子で比較した結果を設定できるというのは、なかなか興味深いですね。今回はわかりやすい例を挙げるため、整数型のオブジェクトと比較しました。次回はもう少し深堀してみようと思います。お楽しみに!!