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.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng