Mặc định Python so sánh object bằng identifier (id), nên hai instance khác nhau luôn không bằng nhau dù dữ liệu giống hệt.
Vấn đề
class Integer:
def __init__(self, number):
self.number = number
n1 = Integer(1)
n2 = Integer(1)
print(n1 == n2) # False (so sánh id)
Giải pháp: Override __eq__
class Integer:
def __init__(self, number):
self.number = number
def __eq__(self, other):
if not isinstance(other, Integer):
return NotImplemented
return self.number == other.number
# Python 3: __ne__ tự động dựa trên __eq__
# Python 2: cần override __ne__ riêng
n1 = Integer(1)
n2 = Integer(1)
print(n1 == n2) # True
print(n1 != n2) # False
Best practice cho __eq__
- Trả về
NotImplemented(không phảiFalse) khi type không khớp - cho phép Python thửother.__eq__(self). - Kết hợp với
__hash__nếu object dùng trong set/dict key (object mutable không nên hash). - Có thể dùng
dataclasses(Python 3.7+) tự động sinh__eq__.