2

カスタム クラスのインスタンスが互いに類似性を比較できるようにしたいと考えています。__cmp__これは、オブジェクトの並べ替え順序を決定するために使用されるメソッドとは異なります。

これに意味のある魔法の方法はありますか?これを行うための標準的な構文はありますか?

これがどのように見えると私が想像するか:

>>> x = CustomClass("abc")
>>> y = CustomClass("abd")
>>> z = CustomClass("xyz")
>>> x.__<???>__(y)
0.75
>>> x <?> y
0.75
>>> x.__<???>__(z)
0.0
>>> x <?> z
0.0

はマジック<???>メソッド名で、<?>は演算子です。

4

6 に答える 6

4

データモデルの数値型エミュレーションを見て、自分に合った演算子フックを選んでください。

ただし、現在、完全に一致する演算子はないと思います。したがって、標準演算子をオーバーロードしたことで、不幸な将来のコード管理者 (あなたでさえあるかもしれません) を驚かせることになります。

レーベンシュタイン距離の場合、代わりに通常の方法を使用します。コードを読むと、one.similarity(other)メソッドがより明確になります。

于 2013-01-28T21:07:12.653 に答える
3

まあ、から十分に奇妙な結果を返すことによって、ブール値の論理的等価性と「ファジー」類似性の両方を意味するようにオーバーライドできます。__eq____eq__

class FuzzyBool(object):
    def __init__(self, quality, tolerance=0):
        self.quality, self._tolerance = quality, tolerance
    def __nonzero__(self):
        return self.quality <= self._tolerance
    def tolerance(self, tolerance):
        return FuzzyBool(self.quality, tolerance) 
    def __repr__(self):
        return "sorta %s" % bool(self)

class ComparesFuzzy(object):
    def __init__(self, value):
        self.value = value
    def __eq__(self, other):
        return FuzzyBool(abs(self.value - other.value))
    def __hash__(self):
        return hash((ComparesFuzzy, self.value))
>>> a = ComparesFuzzy(1)
>>> b = ComparesFuzzy(2)
>>> a == b
sorta False
>>> (a == b).tolerance(3)
sorta True

コンパレーターのデフォルトの動作は、比較された値が正確に等しい場合にのみ Truthy である必要があるため、通常の同等性は影響を受けません。

于 2013-01-28T21:28:17.230 に答える
2

いいえ、ありません。クラスメソッドを作成できますが、探していることを実行するオーバーロードする直感的な演算子はないと思います。また、混乱を避けるために、明らかに直感的でない限り、オーバーロードは避けます。

私は単に CustomClass.similarity(y) と呼びます

于 2013-01-28T21:09:00.937 に答える
1

どのコンテキストでもこれに意味のある魔法のメソッド (および対応する演算子) はないと思います。

ただし、少し空想的に、インスタンスをベクトルとして見ることができる場合、類似性をチェックすることは、スカラー積を計算することに類似している可能性があります。その場合、これに乗算記号を使用することは理にかなっています (インスタンス__mul__の積を既に定義していない限り)。CustomClass

于 2013-01-28T21:05:53.980 に答える
0

そのための魔法の関数/演算子はありません。

int と float の「類似性」というと、その差が一定の閾値よりも低いことを思い浮かべます。おそらくそれはあなたが使うかもしれないものですか?

たとえば、オブジェクト間の「差」を計算できることは、subメソッドに適している場合があります。

于 2013-01-28T21:25:02.613 に答える
0

あなたが引用した例では、difflib を使用します。これにより、文字列間の比較のようなスペル チェックが実行されます。しかし、一般的に、文字列ではなくオブジェクトを実際に比較しているのであれば、私は他の意見に同意します。おそらくコンテキスト固有のものを作成する必要があります。

于 2013-01-28T21:29:06.633 に答える