Python 2.xには、比較演算子、__cmp__
またはなどの「豊富な比較演算子」をオーバーロードする方法が2つあります__lt__
。 豊富な比較オーバーロードが好ましいと言われていますが、なぜそうなのでしょうか。
豊富な比較演算子はそれぞれを実装する方が簡単ですが、それらのいくつかをほぼ同じロジックで実装する必要があります。ただし、組み込みcmp
およびタプルの順序付けを使用できる場合は、__cmp__
非常に単純になり、すべての比較が実行されます。
class A(object):
def __init__(self, name, age, other):
self.name = name
self.age = age
self.other = other
def __cmp__(self, other):
assert isinstance(other, A) # assumption for this example
return cmp((self.name, self.age, self.other),
(other.name, other.age, other.other))
この単純さは、豊富な比較の6(!)すべてをオーバーロードするよりもはるかによく私のニーズを満たしているようです。(ただし、「スワップされた引数」/反映された動作に依存している場合は、「わずか」4に下げることができますが、私の考えでは、複雑さの正味の増加になります。)
オーバーロードするだけの場合に知っておく必要のある予期しない落とし穴はあり__cmp__
ますか?
私は理解して<
、<=
、==
、などの事業者が他の目的のために、オーバーロードすることができ、そして、彼らが好きな任意のオブジェクトを返すことができます。私はそのアプローチのメリットについて尋ねているのではなく、数値に対して意味するのと同じ意味でこれらの演算子を比較に使用する場合の違いについてのみ尋ねています。
更新: Christopherが指摘したように、cmp
は3.xで姿を消しています。上記と同じくらい簡単に比較を実装できる代替手段はあります__cmp__
か?