私は魔法の比較メソッドのいくつかの混乱した動作に遭遇しました。 たちは以下のクラスがあるとします。Pythonのマジックメソッドの混乱
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)
クラスは、行うことになっているものを行い、通常のintまたはfloatにMutNumオブジェクトを比較することは問題ありません。しかし、これは私が理解していないことです。マジックメソッドに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
これはなぜ機能しますか?ありがとう。次のように
たとえば、 '__gt__'と' __lt__'は '__add__'と' __radd__'と同じ関係にあると考えるのが役に立ちます。最初のものが適用されない場合、Pythonはオペランドを逆にしてもう一方を試みます。 – chepner