6
class x:
    def __init__(self,name):
        self.name=name

    def __str__(self):
        return self.name

    def __cmp__(self,other):
        print("cmp method called with self="+str(self)+",other="+str(other))
        return self.name==other.name
       # return False


instance1=x("hello")
instance2=x("there")

print(instance1==instance2)
print(instance1.name==instance2.name)

ここでの出力は次のとおりです。

cmp method called with self=hello,other=there
True
False

これは私が期待したものではありません:「名前フィールドが等しい場合、2 つのインスタンスは等しい」と言おうとしています。

単純に関数return Falseからの__cmp__場合、これも同様に報告さTrueれます!! を返す-1と - が得られますFalseが、文字列を比較しようとしているので、これは正しくありません。

ここで何が間違っていますか?

4

5 に答える 5

10

__cmp__(x,y)x < yの場合は負の数 (-1 など)、 の場合は正の数 (1 など)、 の場合はx > y0を返す必要がありx == yます。ブール値を返すべきではありません。

あなたが過負荷にしているのは__eq__(x, y).

于 2010-01-27T11:01:19.527 に答える
5

メソッドは、__cmp__self < other、self == other、self > other の場合、-1、0、または 1 を返す必要があります。

できるよ

return cmp(self.name, other.name)

適切な結果を得るためにコードで

于 2010-01-27T11:01:16.517 に答える
4

と混同__cmp__してい__eq__ます。

のドキュメントから__cmp__:

self < other の場合は負の整数、self == other の場合はゼロ、self > other の場合は正の整数を返す必要があります。

__eq__2 つのオブジェクトが等しいかどうかを判断するブール値を返します。2 つのオブジェクトが互いに__cmp__大きいか小さいかを判断する整数を返します。特定__eq__の 、__ne____le__、およびメソッド__ge__がない場合は呼び出されます。__lt____gt__

あなたの場合、他の比較のために他の5つのメソッドを実装するのを節約するのでは__cmp__なく、メソッドが必要です。__eq__

cmp()関数を使用して、__cmp__メソッドに次のように記述できます。

return cmp(self.name,other.name)

Ignacio が強調しているように、これはPython 3.0では推奨される方法ではありませんが、Python 2.x では使用__cmp__する方法です。

于 2010-01-27T11:03:54.380 に答える
2

__cmp__()陳腐化しています。__lt__()__eq__()、および を__gt__()代わりに定義します。

たとえそうであっても、あなたのやり方は間違っています。整数を返すことになっています。

于 2010-01-27T11:00:17.993 に答える
0

のドキュメントを参照して__cmp__ください。整数を返す必要があります。

self < other の場合は負の整数、self == other の場合はゼロ、self > other の場合は正の整数を返す必要があります。

于 2010-01-27T11:03:27.417 に答える