この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、データ型変換処理の特殊メソッドについて学びました。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/H/HiroCom777/20240614/20240614200539.jpg)
今回も特殊メソッドです。オブジェクトの値比較時の処理について見ていきましょう。
オブジェクトの値比較
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): # print('__eq__が実行されました') return self.val == other def __ne__(self, other): # print('__ne__が実行されました') return not self.__eq__(other) def __lt__(self, other): # print('__lt__が実行されました') return self.val < other c1 = ClassTest_2(1) print(c1 == 1) # Trueを返す print(c1 != 1) # Falseを返す print(c1 < 1) # Falseを返す print(c1 < 2) # Trueを返す
正しく比較できていますね。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を返す
次回もオブジェクトの値比較
いかがでしようか。比較演算子で比較した結果を設定できるというのは、なかなか興味深いですね。今回はわかりやすい例を挙げるため、整数型のオブジェクトと比較しました。次回はもう少し深堀してみようと思います。お楽しみに!!