Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Sử dụng toán tử so sánh (equality) trong class Python

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ải False) 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__.