Pythonの比較演算子の特殊メソッドは、
- __lt__(self, other) ... self < other
- __le__(self, other) ... self <= other
- __eq__(self, other) ... self == other
- __ne__(self, other) ... self != other
- __ge__(self, other) ... self >= other
- __gt__(self, other) ... self > other
の6種類があるけど、__lt__メソッドを実装すれば __gt__メソッドが、__le__メソッドを実装すれば __ge__メソッドが勝手に用意される。
これは __gt__(self, other) は引数を逆にした __lt__(other, self) と同じ結果になるので、__lt__メソッドさえ実装すれば__gt__メソッドの方はPythonが良きに計らってくれるからで、__le__メソッドと __ge__メソッドも同じ関係。
それなら、__ge__(self, other) は not __lt__(self, other)と同じなんだから、__lt__メソッドさえ実装すれば、__ge__メソッドも勝手に用意してくれるんじゃないだろうか?と思ったのだけど、そこまではしてくれないらしい。しちゃいけない理由って特に無さそうなんだけどなあ。
ちなみにFlyweightパターンを使っている場合、同じインスタンスが使い回されるので、__eq__メソッド(と __ne__メソッド) の実装も事実上不要になる。ついさっき __eq__メソッドを実装しようとして、先に書いたテストが成功したのはそのせいだった。
たまたま直前に__lt__メソッドを実装したばかりだったので、__eq__メソッドが (not self.__lt__(other)) & (not other.__lt__(self)) で使えるようになったのか?と少し悩んだのが恥ずかしかったので、メモ代わりにこのエントリを書いた。
0 件のコメント:
コメントを投稿