Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Phương thức eq trong Python
Trong bài viết này, bạn sẽ học cách sử dụng phương thức đặc biệt __eq__
trong Python để so sánh hai đối tượng dựa trên giá trị của chúng. Phương thức __eq__
cho phép bạn tùy chỉnh logic so sánh, giúp kiểm tra tính bằng nhau của các đối tượng không chỉ dựa trên địa chỉ bộ nhớ mà còn dựa trên các thuộc tính cụ thể của chúng.
Giới thiệu về phương thức eq trong Python
Giả sử bạn có lớp Person
với ba thuộc tính là first_name
, last_name
, và age
như sau:
class Person: def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age
Bây giờ, bạn tạo hai đối tượng từ lớp Person
:
john = Person('John', 'Doe', 25) jane = Person('Jane', 'Doe', 25)
Trong ví dụ này, john
và jane
là hai đối tượng khác nhau, và bạn có thể kiểm tra điều này bằng cách sử dụng toán tử is
:
Bài viết này được đăng tại [free tuts .net]
print(john is jane) # False
Khi so sánh john
với jane
bằng toán tử bằng (==
), kết quả cũng sẽ là False
:
print(john == jane) # False
Mặc dù cả hai đối tượng có cùng độ tuổi, nhưng Python mặc định không cho rằng chúng bằng nhau vì chưa có phương thức nào được định nghĩa để so sánh dựa trên giá trị của chúng. Để thay đổi điều này, bạn cần triển khai phương thức đặc biệt __eq__
trong lớp Person
.
Cách hoạt động của phương thức eq trong Python
Python tự động gọi phương thức __eq__
của một lớp khi bạn sử dụng toán tử ==
để so sánh các đối tượng của lớp đó. Mặc định, Python sẽ sử dụng toán tử is
nếu lớp không có triển khai riêng cho __eq__
.
Dưới đây là cách bạn có thể định nghĩa phương thức __eq__
để so sánh các đối tượng dựa trên thuộc tính age
:
class Person: def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age def __eq__(self, other): return self.age == other.age
Bây giờ, nếu bạn so sánh hai đối tượng của lớp Person
với cùng độ tuổi, kết quả sẽ là True
:
john = Person('John', 'Doe', 25) jane = Person('Jane', 'Doe', 25) print(john == jane) # True
Và nếu hai đối tượng có độ tuổi khác nhau, kết quả sẽ là False
:
mary = Person('Mary', 'Doe', 27) print(john == mary) # False
Xử lý so sánh với kiểu dữ liệu khác trong Python
Nếu bạn so sánh một đối tượng Person
với một giá trị không phải là đối tượng của lớp Person
, chẳng hạn như số nguyên, bạn sẽ gặp lỗi vì đối tượng số nguyên không có thuộc tính age
:
print(john == 20)
Lỗi xuất hiện sẽ là:
AttributeError: 'int' object has no attribute 'age'
Để khắc phục, bạn cần sửa đổi phương thức __eq__
để kiểm tra xem đối tượng so sánh có phải là một thể hiện của lớp Person
hay không trước khi truy cập thuộc tính age
. Nếu đối tượng không phải là một thể hiện của Person
, phương thức sẽ trả về False
:
class Person: def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age def __eq__(self, other): if isinstance(other, Person): return self.age == other.age return False
Bây giờ, bạn có thể so sánh một đối tượng Person
với một số nguyên hoặc bất kỳ đối tượng nào khác mà không gặp lỗi:
print(john == 20) # False
Dưới đây là đoạn mã hoàn chỉnh:
class Person: def __init__(self, first_name, last_name, age): self.first_name = first_name self.last_name = last_name self.age = age def __eq__(self, other): if isinstance(other, Person): return self.age == other.age return False john = Person('John', 'Doe', 25) jane = Person('Jane', 'Doe', 25) mary = Person('Mary', 'Doe', 27) print(john == jane) # True print(john == mary) # False print(john == 20) # False
Kết bài
Việc triển khai phương thức __eq__
giúp bạn linh hoạt hơn trong việc so sánh các đối tượng trong Python, đặc biệt khi cần so sánh dựa trên giá trị thay vì địa chỉ bộ nhớ. Điều này làm cho mã nguồn dễ hiểu hơn và giúp đảm bảo tính chính xác khi so sánh các đối tượng có cấu trúc phức tạp.