2010年10月23日土曜日

Pythonの比較演算子の特殊メソッド

以下、Python 3.1.2でのみ確認。

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 件のコメント:

コメントを投稿