6

私は魔法の比較方法のいくつかの紛らわしい振る舞いに出くわしました。次のクラスがあるとします。

class MutNum(object):
    def __init__ (self, val):
        self.val = val

    def setVal(self, newval):
        self.val = newval

    def __str__(self):
        return str(self.val)

    def __repr__(self):
        return str(self.val)

    # methods for comparison with a regular int or float:
    def __eq__(self, other):
        return self.val == other

    def __gt__(self, other):
        return self.val > other

    def __lt__(self, other):
        return self.val < other

    def __ge__(self, other):
        return self.__gt__(other) or self.__eq__(other)

    def __le__(self, other):
        return self.__lt__(other) or self.__eq__(other)

MutNum オブジェクトを通常の int または float と比較することは問題ありません。しかし、これは私が理解していないことです。魔法のメソッドに2つのMutNumオブジェクトが与えられた場合でも、うまく比較できます。

a = MutNum(42)
b = MutNum(3)
print(a > b) # True
print(a >= b) # True
print(a < b) # False
print(a <= b) # False
print(a == b) # False

なぜこれが機能するのですか?ありがとう。

4

2 に答える 2

5

次のように評価されます (repr変数を参照する代わりに - のような表記を使用します)。

   MutNum(42) > MutNum(3)
=> MutNum(42).__gt__(MutNum(3))
=> MutNum(42).val > MutNum(3)
=> 42 > MutNum(3)

そしてそこからは、既に機能することを知っている int-MutNum 比較にすぎません。

于 2013-11-01T16:56:47.383 に答える