Ich habe in etwas verwirrendes Verhalten der magischen Vergleichsmethoden gelaufen. Angenommen, wir die folgende Klasse haben:Python magische Methode Verwirrung
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)
Die Klasse tut, was es tun soll, ein MutNum Objekt zu einem regulären int oder float Vergleich ist kein Problem. Jedoch, und das ist was ich nicht verstehe, es sogar gut vergleicht, wenn den magischen Methoden zwei MutNum-Objekte gegeben werden.
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
Warum funktioniert das? Vielen Dank.
Es könnte hilfreich sein, sich '__gt__' und' __lt__' vorzustellen, die zum Beispiel in der gleichen Beziehung wie '__add__' und' __radd__' stehen. Wenn das erste nicht zutrifft, versucht Python das andere mit umgekehrten Operanden. – chepner