3

こんにちは、オーバーライドしています__cmp__。渡された 2 番目のオブジェクトが であるNone場合、または のインスタンスでない場合はsomeClass、 を返します-1

ここで何が起こっているのか正確にはわかりません。

class someClass():
    def __cmp__(self, obj):
        if obj == None:
            return -1
        if not isinstance(obj, someClass):
            return -1  

私のテスト機能:

def test_function(self):  
        obj1 = someClass()
        self.assertTrue(obj1 < None)
        # I get true.
        self.assertTrue(obj1 > None)
        # I get failure as False is returned.

誰でも私に説明してもらえますか:

  • 戻り値は何ですか?
  • それが戻るかどうか、または比較記号がいつ変更されるかをどのように決定していTrueますFalseか?
4

3 に答える 3

8

の規則__cmp__は次のとおりです。

a < b : return -1
a = b : return 0
a > b : return 1

もちろん、これはaとの両方bが互換性のある型、たとえば数値である場合にのみ意味があります。aorbが None または非互換 ( ) である「まれなケース」がある場合、これはインスタンスでの比較演算子の使用not instanceofにおけるプログラミング エラーであるため、エラーを報告する必要があります。someClass

で任意の動作を実装することは可能ですが__cmp__、OP で説明されている方法で None と比較すると、最終的に奇妙な動作やバグが発生します。

参照: __cmp__ の代わりに __lt__ http://docs.python.org/reference/datamodel.html#object.__cmp__

于 2012-10-16T06:58:21.550 に答える
3

objがの場合、Noneプログラムは -1 を返しますが、負の整数を返す場合は、 が 、が、が であるself < objことを意味します。obj1 < NoneTrueobj1 > Nonefalse

于 2012-10-16T06:59:50.370 に答える
1

Python のドキュメントを見ると、関数がifをcmp返すことがわかります。-1self < other

から__cmp__(obj, None) == -1、 と仮定したobj < None

私の推測では、オブジェクトはオブジェクトなしよりも優れているため、__cmp__(obj, None)返されるはずです:)1

于 2012-10-16T06:58:29.897 に答える