Tôi đã gặp một số hành vi khó hiểu của các phương pháp so sánh ma thuật. Giả sử chúng ta có lớp sau đây:Sự nhầm lẫn về phương pháp ma thuật 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)
Lớp làm những gì nó là vụ phải làm, so sánh một đối tượng MutNum đến một float int hoặc thường xuyên là không có vấn đề. Tuy nhiên, và đây là những gì tôi không hiểu, nó thậm chí còn so sánh tốt khi các phương pháp ma thuật được đưa ra hai đối tượng 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
Tại sao tính năng này hoạt động? Cảm ơn.
Ví dụ: có thể giúp suy nghĩ về '__gt__' và' __lt__' trong cùng một mối quan hệ với '__add__' và' __radd__'. Nếu cái đầu tiên không áp dụng, Python sẽ thử cái kia với các toán hạng được đảo ngược. – chepner