Pythonで比較演算子をオーバーロードする方法をわかりやすく解説
Pythonには、演算子の挙動をカスタマイズ(オーバーロード)するための「マジックメソッド(特殊メソッド)」が用意されています。比較演算子(<、<=、>、>=、==、!=)をオーバーロードしたい場合は、それぞれに対応するマジックメソッド __lt__、__le__、__gt__、__ge__、__eq__、__ne__ をクラス内に定義します。
各比較演算子と対応するマジックメソッド
| 演算子 | マジックメソッド |
|---|---|
| < | __lt__ |
| <= | __le__ |
| > | __gt__ |
| >= | __ge__ |
| == | __eq__ |
| != | __ne__ |
サンプルプログラム:distanceクラスでの実装例
以下のプログラムでは、距離(フィートとインチ)を表す distance クラスを作成し、== 演算子と >= 演算子をオーバーロードして、オブジェクト同士を比較できるようにしています。
class distance:
def __init__(self, x=5, y=5):
self.ft = x
self.inch = y
def __eq__(self, other):
if self.ft == other.ft and self.inch == other.inch:
return "both objects are equal"
else:
return "both objects are not equal"
def __ge__(self, other):
in1 = self.ft * 12 + self.inch
in2 = other.ft * 12 + other.inch
if in1 >= in2:
return "first object greater than or equal to other"
else:
return "first object smaller than other"
d1 = distance(5, 5)
d2 = distance()
print(d1 == d2)
d3 = distance()
d4 = distance(6, 10)
print(d1 == d2)
d5 = distance(3, 11)
d6 = distance()
print(d5 >= d6)
コードのポイント
- __init__メソッド: デフォルト引数としてフィート(ft)とインチ(inch)を受け取り、インスタンス変数に格納します。
- __eq__メソッド: 2つのオブジェクトのフィートとインチがどちらも一致するかを判定し、等しい場合は「両オブジェクトは等しい」という文字列を返します。
- __ge__メソッド: フィートをインチに換算(1フィート=12インチ)して合計値を求め、大小関係を比較した結果を文字列で返します。
実行結果
上記プログラムを実行すると、オーバーロードされた == および >= 演算子による比較結果が表示されます。
both objects are equal both objects are equal first object smaller than other
このようにマジックメソッドを定義することで、自作クラスのオブジェクトに対しても、組み込み型と同じ感覚で比較演算子を使用できるようになります。なお、実務では比較結果を文字列ではなく True / False のブール値で返すのが一般的です。また、すべての比較メソッドを個別に書くのが面倒な場合は、functools.total_ordering デコレータを利用すると、__eq__ といずれか1つの順序比較メソッドだけで残りの演算子を自動生成できます。
-
Excelで比較演算子を使う方法|6つの演算子の意味とIF関数・VBAでの活用例
知っておくべきポイント Excelで使える比較演算子は6種類:等しい(=)、より大きい(>)、より小さい(<)、以上(>=)、以下(<=)、等しくない(<>)。 比較演算子の最も一般的な使い方は、IF関数の中で条件を判定することです。 この記事では、Excelにおける比較演算子の基本的な使い方を解説します。内容はExcel 2019、2016、2013、2010、Excel for the web(旧Excel Online)、Mac版Excelに対応しています。 Excelで使える6つの比較演算子 Excelでは、以下の6種類の比較演算子を使用できます
-
【Python入門】オブジェクトを破棄する方法|__del__()デストラクタの使い方
Pythonでは、クラスに特殊メソッド__del__()(デストラクタ)を実装することで、インスタンスが破棄される直前に自動的に呼び出される処理を定義できます。このメソッドは、ファイルやネットワーク接続など、メモリ以外のリソースの後始末(クリーンアップ)に活用されます。 サンプルコード 次の例では、__del__()デストラクタが、破棄されようとしているインスタンスのクラス名を出力します。 #!/usr/bin/python class Point: def __init__(self, x=0, y=0): self.x = x self.y =