В этой статье о классах и объектах в языке Python я покажу вам, как сравнивать объекты.
Давайте переопределим метод __eq__ класса, чтобы мы могли использовать операторы сравнения типа ==, позволяющие узнать, одинаковы ли два объекта.
Содержание
Сравнение объектов в Python
Проще всего было бы написать функцию объекта, которая получает другой объект, и вызвать ее вручную. Например:
if obj.is_equal_to(other_obj):
Code language: CSS (css)
Но мы можем сделать это более элегантно, переопределив метод из класса:
if obj == other_obj:
Это также будет работать с оператором in :
if obj in my_list_of_obj:
Определение класса
Мы собираемся задать наш класс обычным образом, но при этом мы определим метод __eq__ . Этот метод получает текущий объект и объект, с которым его нужно сравнить. Мы должны вернуть True или False , указывающие, является ли объект тем же самым, что и другой объект.
Разумеется, сравнение должно быть выполнено нами. В основном мы говорим, что объект равен другому объекту, если все его свойства равны. Но если вы хотите добавить дополнительные условия, вы можете это сделать.
class Game: def __init__(self, name, price): self.name = name self.price = price def __eq__(self, other_game): # Здесь вы можете сравнить что-либо из двух объектов. Вам должно быть возвращено булево значение print("Обращение к __eq__!") return other_game.name == self.name and other_game.price == self.price
В данном случае я определяю класс, представляющий игру, у которой есть название и цена. Переопределяя метод __eq__ , я сравниваю, совпадают ли название и цена.
Помимо этого, я также вывожу сообщение, чтобы мы знали, когда этот метод будет вызван. Опять же, если вам нужно сравнить больше параметров, вы можете это сделать, просто возвращайте булево значение в конце.
Сравнение объектов
Итак, теперь, когда мы определили функцию, которая будет определять, являются ли два экземпляра одинаковыми в Python, мы можем ее использовать. Сначала мы создадим объекты, а затем сравним их:
game1 = Game("Cuphead", 180)
game2 = Game("Cuphead", 180)
game3 = Game("Resident Evil 2", 430)
if game1 == game2:
print("Они одинаковые")
else:
print("Они НЕ одинаковые")
if game1 != game3:
print("game 1 и game 3 - это НЕ одинаковые")
else:
print("game 1 и game 3 - это одинаковые")
Code language: PHP (php)
Как видно на изображении выше, когда мы используем == , Python вызывает внутренний метод __eq__ , поэтому мы перезаписываем сравниваемые параметры.
Таким образом, мы можем сравнивать объекты любого типа. На самом деле, если внутри нашего класса у нас есть свойство, которое само является объектом, и мы правильно определим __eq__ , то сможем рекурсивно сравнивать объекты, внутри которых есть объекты.
Собираем все вместе
Полный код выглядит следующим образом.
class Game: def __init__(self, name, price): self.name = name self.price = price def __eq__(self, other_game): # Здесь вы можете сравнить что-либо из двух объектов. Вам должно быть возвращено булево значение print("Обращение к __eq__!") return other_game.name == self.name and other_game.price == self.price game1 = Game("Cuphead", 180) game2 = Game("Cuphead", 180) game3 = Game("Resident Evil 2", 430) if game1 == game2: print("Они одинаковые") else: print("Они НЕ одинаковые") if game1 != game3: print("game 1 и game 3 - это НЕ одинаковые") else: print("game 1 и game 3 - это одинаковые")
Кстати, кроме __eq__ , который показывает, равны ли два объекта, есть и другие методы, такие как __le__ , __gt__ и т.д. (меньше или больше и т.д.).